在一些頭文件中會有如下的預編譯定義:
#ifdef __cplusplus
extern "C" {
#endif
//函數聲明
int c_func();
#ifdef __cplusplus
}
#endif
__cplusplus是C++編譯器定義的宏
如果是C代碼包含上面的頭文件,則代碼中僅僅包含聲明:
int c_func();
如果是C++代碼包含上面的頭文件,則代碼中會包含:
extern "C" {
int c_func();
}
爲什麼要有這麼一段東西呢?假設有這樣一個場景:目前已經有了一個用C寫好的庫,現在用C++編寫另外的代碼,這段代碼需要用到這個C庫,由於C++有重載機制,C沒有,C++的編譯器會將函數聲明轉換成C++風格的聲明,而這個聲明和C函數聲明不一樣。如果沒有上面的extern “C",那麼C庫中的函數跟C++風格的聲明不一致,C++代碼鏈接C庫就會失敗,提示函數未定義的錯誤。
extern "C"就是爲了保證函數聲明以C編譯風格處理。