[問題] 請問一個.cpp檔與.h中define的作用

看板C_and_CPP作者 (Zoxge)時間12年前 (2013/08/12 00:30), 編輯推噓4(4016)
留言20則, 7人參與, 最新討論串1/1
開發平台(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)

08/12 00:37, , 1F
感覺有點畫蛇添足...函式宣告都是 extern 啊
08/12 00:37, 1F

08/12 00:45, , 2F
大概為了某個沒有extern的奇怪compiler吧?
08/12 00:45, 2F

08/12 00:51, , 3F
用來宣告 declspec 好像比較合適?用來切換
08/12 00:51, 3F

08/12 00:51, , 4F
dllimport/dllexport 這樣
08/12 00:51, 4F

08/12 01:44, , 5F
嗯, 像是 MSDN 這裡最下面範例 http://tinyurl.com/lfupd4s
08/12 01:44, 5F

08/12 01:44, , 6F
不過單純切換 extern 的就很詭異了
08/12 01:44, 6F

08/12 22:07, , 7F
這個用法比較有可能是 xxx.cpp 有 void FUNCTION(void){}
08/12 22:07, 7F

08/12 22:09, , 8F
的實體,所以 include "xxx.h" 遇到函式原型就不需加上
08/12 22:09, 8F

08/12 22:10, , 9F
extern,編譯器能判斷屬內部連結,那其他 .cpp 檔如果
08/12 22:10, 9F

08/12 22:10, , 10F
include "xxx.h" 而沒有 void FUNCTION(void){} 實體的話,
08/12 22:10, 10F

08/12 22:12, , 11F
就會遇到 extern void FUNCTION(void); 的定義了,編譯器會
08/12 22:12, 11F

08/12 22:13, , 12F
把呼叫 FUNCTION() 函式的敘述交給 Linker 來處理,而不用等
08/12 22:13, 12F

08/12 22:14, , 13F
到全部 .cpp 檔編譯完後發現沒有 FUNCTION 實體才交給
08/12 22:14, 13F

08/12 22:15, , 14F
Linker 處理外部連結,純粹是編譯效率的考量.
08/12 22:15, 14F

08/12 23:09, , 15F
No, 這邊有沒有 extern 對 compiler 來說完全沒差
08/12 23:09, 15F

08/12 23:25, , 16F
我覺得切 extern "C" 之類的 declspec 應比較合適?
08/12 23:25, 16F

08/12 23:38, , 17F
推 extern "C"
08/12 23:38, 17F

08/13 00:47, , 18F
不過這裡的用法顯然不是要切換 extern "C"
08/13 00:47, 18F

08/13 00:47, , 19F
不然要檢查的巨集就不該是 _XXX_CPP_ 而是 __cplusplus 了
08/13 00:47, 19F

08/13 00:48, , 20F
再說要在 header 裡弄只給 C++ 看的 extern "C" 沒那麼費工
08/13 00:48, 20F
文章代碼(AID): #1I1xmog2 (C_and_CPP)