extern "C"{}的作用就是說明這在{}范圍之內說明的函數是按c,或者需要按c標準來編譯。可以從聲明調用二個方面來描述它的作用:
1.聲明
以下c++代碼:
extern "C" { void test() }
void test()
{
// do test
}
表示希望編譯器使用c標準來編譯test函數。而在c語言中不支持extern "C"。
2.c++代碼調用c代碼
extern "C" { void test() //test()是c代碼或者或者說明是按c標準編譯的代碼 }
int main()
{
test();
}
無論test函數是c寫的還是c++寫的,只要它是按c標準編譯的,就需要加上extern "C" 聲明
3.c調用c++代碼
c要調用c++代碼,在c++代碼中必須以extern "C" 來聲明函數,如上文1所示。以下是c代碼
void test();
int main()
{
test();
}
例如:
#ifdef __cplusplus /* __cplusplus 表示是C++程序 */
extern "C" { //這是什么意思 ?????????????
#endif /* __cplusplus */
表示如果現在的編譯環境是C++的話,讓編譯器生成C樣式的函數名,也就是阻止編譯器使用C++的方法進行函數名解析。
C++中因為函數可以重載:
int a(char)
int a(int)
int a(double)...
所以,在編譯后的代碼里,三個a()是不同的函數名如a_char_xxx,a_in_xxx,a_double_xxx等等.
要去掉后面的一大串符號只要在a()前面加上exter "C"即可
在DLL的對外接口函數中,必須用exter "C" 限制,否則,外部調用者根本不知道你的真正函數名.
1 VC6.0編譯器可以按C++或C生成目標函數. 兩者生成的目標符號表
并不一樣. C方式是與原來標準C相兼容.
2 在DLL中的接口函數一般應按C方式編譯而成. extern "C" 就是強
制指定. 如果不按這種方式指定.GetProcAddress(...)取出來的
就不對. 只能隱式連接.
extern "c" 的作用就是使得函數的定義名稱和導出名稱一致