2010-02-12 61 views
1

是否可以在我的頭文件中添加#define _MYDEFINE_,這取決於項目設置中的一些選項。對於例如:假設在我裸露的頭文件(這是與庫提供一起)我有一些宏象圖所示:是否可以使用某些項目設置或makefile選項將一些宏定義到頭文件中?

#ifdef _MYDEFINE_ 
#define ABC 2 
#else 
#define ABC 4 
#endif 

現在,同時建立我的圖書館,我可以在我的設置中添加_MYDEFINE_,但我不希望圖書館的用戶在他的項目設置或代碼中添加_MYDEFINE_。相反,我想要「#define _MYDEFINE_」自動添加到標題的開頭。

注意:#define _MYDEFINE_只有在我的預處理器設置中定義時才應該添加。對於其他設置,它不應該被添加。

如果不能通過項目設置,是否有任何創新的方法來完成它? 歡迎任何想法。

回答

2

您可能需要考慮_MYDEFINE_對您的庫有什麼影響。

如果你想要它的效果只用於開發(如NDEBUG),使用-D/D編譯器選項應該沒問題。

如果它的影響會影響用戶使用該庫時發生的情況,則可能需要做一些更詳細的操作。在後一種情況下,您將創建兩個版本的庫,並且您可能想要將它們命名爲:如libX-ABC2.a和libX-ABC4.a。而且您還需要兩個版本的包含文件,並且您可能需要生成配置頭文件,其中每個文件都適當地定義了_MYDEFINE_。如果您的庫已安裝,則可能需要爲頭文件提供版本化的包含目錄。

如果,例如,_MY_DEFINE_影響宣稱結構的佈局或其他頭部已聲明數組的大小,其用戶包括報頭#define ABC 4與假設#define ABC 2庫,你會引入一些討厭的錯誤爲您的用戶追查。

我以前見過這個。照顧這件事很困難和乏味,但不這樣做可能會對您的不同版本的圖書館造成嚴重的問題。

4

大多數C編譯器接受選項-D定義符號:

gcc -D_MYDEFINE_ file.c 

在這種形式,它是隱含設置爲1。否則,一個人可以明確地設定一個值:

gcc -D_MYDEFINE_=4 file.c 

-D是允許的,甚至在操作系統,這使得難(如VMS)。

gcc -DSYMBOL1 -DSYMBOL2 -DSYMBOL3 file.c 

這些行爲就像對應#define語句每個命令行文件的第一行之前出現。

#define SYMBOL1 1 (these are virtually present due to command line -D options) 
#define SYMBOL2 1 
#define SYMBOL3 1 

(actual source code begins) 
/* 
* file.c: 
*/ 
#include <ctype.h> 
#include <stdlib.h> 
... 
0

您似乎在尋找「/ D」編譯器標誌(幾乎在地球上每個C編譯器中都是幾個相同的標誌之一)。用法是這樣的:cc /D_MYDEFINE_ myfile.c

到無關的一邊,注意,像_MYDEFINE_以下劃線緊接着又下劃線或大寫字母開頭的名稱被保留用於執行 - 即你不應該使用這樣的事情。

+0

我剛剛加了_MYDEFINE_爲例。我真的不會這樣命名我的常量。但是,/ D將定義添加到暴露的頭文件中?我正在從一個暴露頭文件的庫的角度來談論,這些頭文件將被某些應用程序使用。 – Jay

+0

@Jay:不,「/ D」通常在makefile中,而不是任何源文件。所以基本上,當你構建庫時,你會將它添加到makefile中。 –

1

有一個生成配置頭文件,並在包含任何其他頭文件之前包含此頭文件。這個構建配置頭文件可以在構建時使用一些腳本機制來創建。

相關問題