2011-01-25 21 views
1

我在正在處理的程序中遇到問題。我正在嘗試--help顯示哪些功能被編譯或不。然而,這些有很多,而「正常」的方式太冗長了。例如: -使用另一個宏生成#ifdef,#endif子句

#ifdef HAVE_FOO 
static const bool have_foo = true; 
#else 
static const bool have_foo = false; 
#endif 
printf("Support for foo: %s\n", have_foo ? "yes" : "no"); 

現在,因爲我必須爲每一個功能基本上做到這一點,這將是行,這是我不希望的負荷。

所以我想我會寫一些宏吧:

#define _SUPP(X) #ifdef HAVE_##X \ 
static const bool _##X##_SUPP = true; \ 
#else \ 
static const bool _##X##_SUPP = false; \ 
#endif 

#define _PRINTSUPP(var, name, desc) printf("\t%s - %s: %s\n", name, desc, _##var##_SUPP ? "yes" : "no") 

然而,有一個問題在這裏。宏將被擴展爲一行,並且預處理器會在此處扼殺。有沒有一種方法可以用實際的換行符來生成一個宏,還是可以在一條線上評估一個#ifdef

回答

3

如果不是沒有界定HAVE_FOO,你定義它0,你可以這樣做:

const struct { 
    bool present; 
    const char *name; 
} features[NFEATURES] = { 
    {HAVE_FOO, "foo"}, 
    {HAVE_BAR, "bar"}, 
    ... 
}; 

for (size_t i=0; i < NFEATURES; i++) 
    if (features[i].present) 
     printf(" ... and we've got: %s\n", features[i].name); 

你必須檢查#if HAVE_FOO代替#ifdef HAVE_FOO然後,並且可以顯示你的--help消息如果你的特徵數量在數量上運行的話,這會慢一點(在這種情況下,我會推薦不同的體系結構)。

+1

猜測你在`features`的聲明中缺少'[]`,不是嗎? – 2011-01-25 12:36:55

2

你不能在C中執行此操作。通常的方法是從生成這樣的頭文件,例如Perl或Python中的某些文本描述。

0

您不能使用宏創建另一個預處理指令。所有預處理指令都在宏展開開始前被識別,所以你的宏將被解釋爲錯誤的C代碼。