2011年10月26日 星期三

extern "C"


大家都知道extern "C"這個關鍵字是用來讓C++與C相容

例如:
extern "C" {
       int func(int);
       int var;
   }

C++會把大括號裡面的code當作C來處理
因此不會使用C++的Name Mangling機制
而會使用C原本的機制
目前Visual C++會把符號前面加上"_"
GCC則不會做修飾

因此我們常常會看到C Library中這樣寫
#ifdef __cplusplus
extern "C" {
#endif

void *memset (void *, int, size_t);
char *strcat (char *, const char *);
int   strcmp (const char *, const char *);
char *strcpy (char *, const char *);


#ifdef __cplusplus
}
#endif

就是因為C++會自動把memset修飾成_Z6memsetPvii
造成Linker在C Library中找不到這個符號發生錯誤
這時候可以使用__cpluscplus這個Macro來辨別是否是編譯C++程式
Compiler會在編譯C++程式時自動定義這個Macro

沒有留言:

張貼留言