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