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

2021-06-21 09:28:58 字數 1221 閱讀 8793

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

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...