文章目錄
- extern "C" 介紹
- extern "C" 使用示例
- 1.2.2 作用場景
上篇文章:ARM 嵌入式 編譯系列 4.1 – GCC 編譯屬性 likely與unlikely 學習
下篇文章:ARM 嵌入式 編譯系列 5 – GCC 內建函數 __builtin 介紹
extern “C” 介紹
extern “C” 是一種鏈接規范,它用于告訴C++編譯器按照C語言的方式來鏈接代碼。這個關鍵字主要用于在C++代碼中調用C語言的函數庫。
C++語言對函數進行了名字修飾(Name Mangling),也就是說,C++編譯器在編譯函數的時候會給函數的名字添加一些額外的信息,例如函數的參數類型和數量。這樣做的目的是為了支持函數的重載。然而,C語言不支持函數的重載,所以C編譯器不會對函數名進行修飾。
例如,函數 void fun(int, int)
,C++ 編譯后的可能是 _fun_int_int
(不同編譯器可能不同,但都采用了類似的機制,用函數名和參數類型來命名編譯后的函數名);而 C 語言沒有類似的重載機制,一般是利用函數名來指明編譯后的函數名的,對應上面的函數可能會是 _fun
這樣的名字。
因此,如果你在C++代碼中直接調用C語言的函數庫,由于名稱修飾的差異,鏈接器將無法找到正確的函數。這時,你就需要使用extern "C"
來告訴C++編譯器,這段代碼應當按照C語言的規則進行鏈接。
extern “C” 使用示例
以下是extern "C"
的一個使用示例:
#ifdef __cplusplus
extern "C" {
#endif #include <your_c_library.h> #ifdef __cplusplus
}
#endif
在這個示例中,我們使用了預處理器指令#ifdef __cplusplus
來檢查是否正在使用C++編譯器。如果是,就添加extern "C"
,這樣C++編譯器就會按照C語言的規則對your_c_library.h
中的代碼進行鏈接。
1.2.2 作用場景
這個功能主要用在下面的情況:
- C++代碼調用C語言代碼;
- 在C++的頭文件中使用;
- 在多個人協同開發時,可能有的人比較擅長C語言,而有的人擅長 C++,這樣的情況下也會有用到。
例如,如果模塊 B 要引用模塊A中定義的全局變量和函數時只需包含模塊A的頭文件即可。這樣模塊 B 中調用模塊A中的函數時,在編譯階段,模塊B雖然找不到該函數,但并不會報錯;它會在鏈接階段從模塊A編譯生成的目標代碼中找到該函數。
extern 對應的關鍵字是 static
,static
表明變量或者函數只能在本模塊中使用,因此,被static
修飾的變量或者函數不可能被 extern C 修飾。
上篇文章:ARM 嵌入式 編譯系列 4.1 – GCC 編譯屬性 likely與unlikely 學習
下篇文章:ARM 嵌入式 編譯系列 5 – GCC 內建函數 __builtin 介紹