C 中為什麼有時要使用extern C

2022-08-28 23:18:27 字數 932 閱讀 8021

在c++引用lua的標頭檔案時,我們總會寫成:

extern "c"
為什麼要這麼做呢?原因是c++的編譯器會對程式中符號進行修飾,這個過程在編譯器中叫符號修飾(name decoration)或者符號改編(name mangling)。

同時我們知道c++是能夠相容c的,如果我們有了乙個c語言的標頭檔案和其對於的庫,在c++中如何使用它呢?在include該標頭檔案的時候當然要加入extern "c",否則按照c++的符號進行符號修飾,那麼在庫中就會找不到該符號了。

為了加深印象,再看乙個例子:

//a minimum program to test why extern "c" is need in c++

#includenamespace myname

extern "c" int _zn6myname3vare;

int main()

編譯執行結果:

$:~/blog/lua$ g++ extern_c.cc

$:~/blog/lua$ ./a.out

4243

0x601040

0x601040

在這個例子中,我們根據g++編譯器的符號修飾規則,仿造了乙個c變數(gcc不進行符號修飾),欺騙了編譯器,把myname::var 和 _zn6myname3vare當成了同乙個變數了。這怎麼有點像是c++中的引用?這裡還是有些不是很理解。

還有另外乙個問題,c語言不支援extern "c"語法,如果我們想寫乙個標頭檔案,同時支援被c和c++引用,該怎麼辦?可以使用c++的巨集 "__cplusplus"來判斷是不是c++編譯器。

#ifdef __cplusplus

extern "c"

#endif

C 中為什麼要使用斷言

斷言assert是僅在debug下有效的巨集,當其中的條件為假時,觸發錯誤提示。使用斷言的目的是捕捉不應該發生的非法情況。注意 不要混淆非法情況與錯誤情況之間的區別,後者的出現是因為 錯誤,是一定要作出處理的。如何使用 1 在函式的入口處,使用斷言檢查引數的有效性 合法性 2 在編寫函式時,要進行反...

c 為什麼要使用介面

c 為什麼要使用介面?通俗的講,就是為了降低耦合度。給大家看乙個我見過的很搞笑的例子。看看下面的程式 乙個學校裡邊,有兩種人 學生 老師。他們都要吃飯和睡覺。public inte ce i人 public class 學生 i人 public void 睡覺 其他特有方法,比如泡妞 打遊戲 pub...

串列埠RS 232 有時為什麼要使用交叉線

在做開發時,我用到兩種裝置 de2板和zigbee開發板。這兩種裝置的rs232串列埠接頭都是母頭的。用串列埠線 公對母且非交叉的 把電腦與de2板或者電腦與zigbee開發板接連後,在pc上開啟串列埠助手,測試到資料的接收與傳送都正常,說明所有的裝置都完好無損。在得知de2板與zigbee開發板的...