相信常在使用一些C library的人,常常會在標頭檔看到以下的程式碼
#ifdef __cplusplusextern "C" {#endif簡單講,這是為了避免C++的name mangling造成linker無法link到正確的symbol。
C++支援function overloading,所以下列兩個function可以同時存在
void foo(int a);void foo(double a);這是因為C++ compiler會將function name"變形",例如:
void func_int(int a);void func_double(double a);這樣就沒有衝突的情形了。
但是用C compiler所編譯出來的object,裡面的symbol可是沒有什麼name mangling的
所以linker當然就沒辦法找到C++變形過後的symbol,就出現unresolved symbol的error了
因此,C++提供了extern "C"這個辦法,只要用extern "C"包起來的,compiler就知道裡面的symbol都是"unmangled"的,例如:
extern "C"{ #include "c_library.h"}如此一來,就可以順利link C compiler所編出的object了
另外,各家compiler實做name mangling的方式也不一樣
所以用VC編好的library,沒辦法直接拿去跟gcc的一起link喔,不過這總比因為不相容造成一堆奇怪的問題好多了
參考資料
http://en.wikipedia.org/wiki/Name_mangling