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