它們之間的連接問題主要是因?yàn)閏 c++編繹器對(duì)函數(shù)名譯碼的方式不能所引起的,考慮下面兩個(gè)函數(shù)
/* c*/
int strlen(char* string)
{
...
}
//c++
int strlen(char* string)
{
...
}
兩個(gè)函數(shù)完全一樣。在c在函數(shù)是通過函數(shù)名來識(shí)別的,而在C++中,由于存在函數(shù)的重載問題,函數(shù)的識(shí)別方式通函數(shù)名,函數(shù)的返回類型,函數(shù)參數(shù)列表三者組合來完成的。因此上面兩個(gè)相同的函數(shù),經(jīng)過C,C++編繹后會(huì)產(chǎn)生完全不同的名字。所以,如果把一個(gè)用c編繹器編繹的目標(biāo)代碼和一個(gè)用C++編繹器編繹的目標(biāo)代碼進(jìn)行連接,就會(huì)出現(xiàn)連接失敗的錯(cuò)誤。
解決的方法是使用extern C,避免C++編繹器按照C++的方式去編繹C函數(shù)
在頭文件中定義:
extern "C" int strlen(char* string)
或
extern "C"
{
int strlen(char* string)
}
當(dāng)C編繹器遇到extern "C"的時(shí)候就用傳統(tǒng)的C函數(shù)編譯方法對(duì)該函數(shù)進(jìn)行編譯。由于C編繹器不認(rèn)識(shí)extern "C"這個(gè)編繹指令,而程序員又希望C,C++程序能共用這個(gè)頭文件,因此通常在頭文件中使用_cplusplus宏進(jìn)行區(qū)分:
#if define _cplusplus
extern "C"{
#endif
int strlen(char* string)
#ifdefine _cplusplus
}
#endif
/* c*/
int strlen(char* string)
{
...
}
//c++
int strlen(char* string)
{
...
}
兩個(gè)函數(shù)完全一樣。在c在函數(shù)是通過函數(shù)名來識(shí)別的,而在C++中,由于存在函數(shù)的重載問題,函數(shù)的識(shí)別方式通函數(shù)名,函數(shù)的返回類型,函數(shù)參數(shù)列表三者組合來完成的。因此上面兩個(gè)相同的函數(shù),經(jīng)過C,C++編繹后會(huì)產(chǎn)生完全不同的名字。所以,如果把一個(gè)用c編繹器編繹的目標(biāo)代碼和一個(gè)用C++編繹器編繹的目標(biāo)代碼進(jìn)行連接,就會(huì)出現(xiàn)連接失敗的錯(cuò)誤。
解決的方法是使用extern C,避免C++編繹器按照C++的方式去編繹C函數(shù)
在頭文件中定義:
extern "C" int strlen(char* string)
或
extern "C"
{
int strlen(char* string)
}
當(dāng)C編繹器遇到extern "C"的時(shí)候就用傳統(tǒng)的C函數(shù)編譯方法對(duì)該函數(shù)進(jìn)行編譯。由于C編繹器不認(rèn)識(shí)extern "C"這個(gè)編繹指令,而程序員又希望C,C++程序能共用這個(gè)頭文件,因此通常在頭文件中使用_cplusplus宏進(jìn)行區(qū)分:
#if define _cplusplus
extern "C"{
#endif
int strlen(char* string)
#ifdefine _cplusplus
}
#endif