__cplusplus 和extern “C”

由於C++編譯器需要支持函數的重載,會改變函數的名稱,因此dll的導出函數通常是標準C定義的。這就使得C和C++的互相調用變得很常見。但是有時可能又會直接用C來調用,不想重新寫代碼,讓標準C編寫的dll函數定義在C和C++編譯器下都能編譯通過,通常會使用以下的格式:(這個格式在很多成熟的代碼中很常見)


#if defined(__cplusplus)
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"。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章