2008年12月9日 星期二

C/C++ Name mangling

相信常在使用一些C library的人,常常會在標頭檔看到以下的程式碼

#ifdef __cplusplus
extern "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

沒有留言: