什麼情況下需要加extern C ,通俗易懂

2021-07-01 20:34:58 字數 1246 閱讀 3859

下午看了一些關於extern "c"的部落格,都寫得很囉嗦,看來看去還是有一些細節不怎麼了解,自己開了個程式測試了一下,總結了什麼情況下需要加入extern 「c」

首先c++和c語言編譯器在將cpp編譯成.o檔案的時候對函式的編譯方式是不一樣的

例如函式void foo(int)

c++編譯器會編譯成_int_foo

c語言編譯器會編譯成_foo()

同樣c++和c語言在鏈結的時候查詢規則也是不一樣的

還是以void foo(int)為例

c++會使用_int_foo去.o檔案中查詢

c會使用_foo()去查詢

這樣問題就來了。如果你在c++鏈結器下呼叫使用c編譯器的檔案(比如dll)那系統會提示找不到函式

反過來也找不到函式。

為了解決這個問題就引入了extern "c",

extern "c" 就是提示編譯器(確切的說是提示c++的編譯器)使用c語言的方式進行編譯或者鏈結

所以為了確保使用不同編譯器編譯出來的**出現找不到函式的情況,在c++編譯器下需要在c**的宣告和定義中都加入extern "c"

同時c++在呼叫這些c函式的時候也應該加入extern "c"(或者引入帶extern "c"的頭)

**如下:

#ifndef foo_h

#define foo_h

#ifdef __cplusplus

extern "c"

#endif

#endif//foo_h

/*包含了foo.h編譯的時候就會自動使用c風格了,如果你不想包含foo.h的話,那還有另外兩種辦法

*1.像頭檔案一樣把所有函式定義包含在extern "c"中

*2.在每個函式定義前加上 extern "c" 如:extern "c" void foo(int)

*上面兩種方法都需要判斷是否c++編譯器,因為在c編譯器中使用extern "c"會報錯,這裡只是幫助理解而已,還是包含標頭檔案吧。

*/#include "foo.h"

void foo(int)

void foo1(char)

#include "foo.h"

int main(int argc, char* argv)

使用c++編譯器(__cplusplus已定義)

g++ -o main  main.cc foo.cc

使用c語言編譯器

gcc -o main  main.cc foo.cc

什麼情況下,需要做血液透析?

血液透析 是 急慢性腎衰竭和其他一些嚴重疾病的重要方法。常見疾病的透析指徵如下 急性腎損傷 一 透析指徵 出現下列任何一種情況即可進行透析 一 血清肌酐 354umol l 4mg dl 或尿量 0.3ml kg h 持續24小時以上。二 高鉀血症,血清鉀 6.5mmol l。三 血hco3 15 ...

什麼情況下需要建立mysql索引

1 較頻繁地作為查詢條件的字段 這個都知道。什麼是教頻繁呢?分析你執行的所有sql語句。最好將他們乙個個都列出來。然後分析,發現其中有些欄位在大部分的sql語句查詢時候都會用到,那麼就果斷為他建立索引。2 唯一性太差的字段不適合建立索引 什麼是唯一性太差的字段。如狀態字段 型別字段。那些只儲存固定幾...

什麼情況下需要建立MySQL索引?

索引可以提高資料的檢索效率,也可以降低資料庫的io成本,並且索引還可以降低資料庫的排序成本。排序分組操作主要消耗的就是cpu資源和記憶體,所以能夠在排序分組操作中好好的利用索引將會極大地降低cpu資源的消耗。如何判定是否需要建立索引?1 較頻繁地作為查詢條件的字段 程式設計客棧這個都知道。什麼是教頻...