《C關鍵字分析》之extern用法

2021-07-09 08:38:06 字數 1159 閱讀 2929

一、假設為三方提供庫原始碼和標頭檔案

1.共享庫部分

sanf.c

#include 

int a;  

void hello()  

編譯:gcc -shared -fpic -o libsanf.so sanf.c 

生成:libsanf.so

2.標頭檔案

sanf.h

extern

int a;  

extern

"c"  

以上sanf.h和libsanf.so即為第三方給我們提供的可用資源。

二、如何使用

1.編譯鏈結

main.cpp

#include 

#include "sanf.h"

int main()  

編譯:g++ -c main.cpp

g++ -o main main.o -lsanf -l.

結果:可執行檔案main

2.執行

./main

tk------->>>>a is 1  

tk------_>>>>>this is hello  

三、說明函式新增extern "c"原因

1.我們看c語言sanf.c編譯的庫libsanf.so中hello的符號

readelf -a libsanf.so

47: 00000000000005cc    18 func    global default   11 hello  

2.我們看c++語言main.cpp在不新增extern "c"時hello的符號

readelf -a main.o

13: 0000000000000000     0 notype  global default  und _z5hellov  

在這種情況下,靜態鏈結時就會找不到符號。

3.c++語言main.cpp在新增extern "c"時hello的符號

readelf -a main.o

13: 0000000000000000     0 notype  global default  und hello  

在這種情況下,靜態鏈結時就能找到符號。

原因:c++語言支援函式多型,導致函式在編譯後生成的符號與c不同。

《C關鍵字分析》之extern用法

一 假設為三方提供庫原始碼和標頭檔案 1.共享庫部分 sanf.c include int a void hello 編譯 gcc shared fpic o libsanf.so sanf.c 生成 libsanf.so 2.標頭檔案 sanf.h extern int a extern c 以上...

extern 關鍵字用法

overrides public virtual bool initinstance extern 摘自 extern lpdirectdraw4 lpdd 宣告lpdd,但是不分配記憶體,只說明他是你可以用的變數,在此程式之外其他的程式中已經聲名了他。其實他就是防止名字衝突 extern 申明本地...

C 之關鍵字extern

最近看了許多關於extern關鍵字的文章,有一些心得體會,本篇博文綜合了許多文章的內容,不正確的地方還希望大家能夠給予指正!其中先指明乙個誤區 許多人認為標頭檔案只能包含宣告,這其實是不對的!一 首先,讓我們來了解宣告和定義的基本概念。1.1.宣告的概念 大概來講宣告主要是為了支援模組 編譯單元 c...