大家都知道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
沒有留言:
張貼留言