由于C++編譯器需要支持函數的重載,會改變函數的名稱,因此dll的導出函數通常是標準C定義的。這就使得C和C++的互相調用變得很常見。但是有時可能又會直接用C來調用,不想重新寫代碼,讓標準C編寫的dll函數定義在C和C++編譯器下都能編譯通過,通常會使用以下的格式:(這個格式在很多成熟的代碼中很常見)
#if defined(__cplusplus)//只有c++編譯器才有這個宏定義。
extern "C" {
#endif
// 在這里寫標準C程序,例如dll導出函數的定義
#ifdef __cplusplus
?????}
#endif
下面解釋一下上面的代碼:
??????首先__cplusplus是C++編譯器內部定義的宏,如果使用的C編譯器,__cplusplus宏不會被定義。它可以作為區分使用的是C編譯器還是C++編譯器的標志。在標準C中C代碼直接寫就可以了。而在C++中,需要加extern "C"或包含在extern "C"塊中。
由于標準C是不支持extern "C"的,會產生變異錯誤,所以使用預編譯指令通過__cplusplus來判斷只有在使用C++編譯器的時候才定義extern "C"。
意思是說,如果是C++程序,就使用
extern "C"{
而這個東東,是指在下面的函數不使用的C++的名字修飾,而是用C的
extern "c" 函數描述?指定它為C函數
extern "C"表示編譯生成的內部符號名使用C約定
?C++支持函數重載,而C不支持,兩者的編譯規則也不一樣。函數被C++編譯后在符號庫中的名字與C語言的不同。例如,假設某個函數的原型為: void foo( int x, int y ); 該函數被C編譯器編譯后在符號庫中的名字可能為_foo,而C++編譯器則會產生像_foo_int_int之類的名字(不同的編譯器可能生成的名字不 同,但是都采用了相同的機制,生成的新名字稱為“mangled name”)。_foo_int_int這樣的名字包含了函數名、函數參數數量及類型信息,C++就是靠這種機制來實現函數重載的。下面以例子說明,如何 在C++中使用C的函數,
?
http://www.cnblogs.com/HappyXie/archive/2011/01/07/1929369.html