看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC 問題(Question): 在業界的code裡面看到的普遍寫法 在xxx.cpp裡: #define _XXX_CPP_ void FUNCTION(void) { ...... } #under _XXX_CPP_ 在對應的xxx.h裡: #ifndef _XXX_H_ #define _XXX_H_ #ifdef _XXX_CPP_ #define INTERFACE #else #define INTERFACE extern #endif INTERFACE void FUNCTION(void); #endif 請問綠色的部份,為什麼要特地這樣寫呢? 如果其它檔案,例如ooo.cpp想要使用FUNCTION() 就不能#include "xxx.h",compiler會有問題 (compiler會說INTERFACE被定義過了,因為ooo.cpp會走#else,而xxx.cpp會走#ifdef) 因此而必須改用extern FUNCTION 但如果要extern FUNCTION,應該不需要去特地#define INTERFACE吧? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.195.197.207 ※ 編輯: Zoxge 來自: 123.195.197.207 (08/12 00:33)
LPH66:感覺有點畫蛇添足...函式宣告都是 extern 啊 08/12 00:37
azureblaze:大概為了某個沒有extern的奇怪compiler吧? 08/12 00:45
Bencrie:用來宣告 declspec 好像比較合適?用來切換 08/12 00:51
Bencrie:dllimport/dllexport 這樣 08/12 00:51
LPH66:嗯, 像是 MSDN 這裡最下面範例 http://tinyurl.com/lfupd4s 08/12 01:44
LPH66:不過單純切換 extern 的就很詭異了 08/12 01:44
GNUGCC:這個用法比較有可能是 xxx.cpp 有 void FUNCTION(void){} 08/12 22:07
GNUGCC:的實體,所以 include "xxx.h" 遇到函式原型就不需加上 08/12 22:09
GNUGCC:extern,編譯器能判斷屬內部連結,那其他 .cpp 檔如果 08/12 22:10
GNUGCC:include "xxx.h" 而沒有 void FUNCTION(void){} 實體的話, 08/12 22:10
GNUGCC:就會遇到 extern void FUNCTION(void); 的定義了,編譯器會 08/12 22:12
GNUGCC:把呼叫 FUNCTION() 函式的敘述交給 Linker 來處理,而不用等 08/12 22:13
GNUGCC:到全部 .cpp 檔編譯完後發現沒有 FUNCTION 實體才交給 08/12 22:14
GNUGCC:Linker 處理外部連結,純粹是編譯效率的考量. 08/12 22:15
littleshan:No, 這邊有沒有 extern 對 compiler 來說完全沒差 08/12 23:09
EdisonX:我覺得切 extern "C" 之類的 declspec 應比較合適? 08/12 23:25
suhorng:推 extern "C" 08/12 23:38
LPH66:不過這裡的用法顯然不是要切換 extern "C" 08/13 00:47
LPH66:不然要檢查的巨集就不該是 _XXX_CPP_ 而是 __cplusplus 了 08/13 00:47
LPH66:再說要在 header 裡弄只給 C++ 看的 extern "C" 沒那麼費工 08/13 00:48