2011-01-25 5 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") 

しかし、問題はここにあります。マクロは1行に展開され、プリプロセッサはこれを突き止めます。実際の改行を使ってマクロを生成する方法はありますか、または#ifdefを1行で評価することは可能ですか?

答えて

3

もし、あなたが行うことができますあなたの機能の数がzillionsで実行されている場合は、少し遅くなります(この場合、私は別のアーキテクチャをとにかくお勧めします)。

+1

あなたは 'features'の宣言に' [] 'がないと思います、いいえ? –

+0

@Jens:ありがとう、固定。 –

2

Cでこれを行うことはできません。通常の方法はというような、PerlやPythonのようなテキスト記述のヘッダを生成することです。

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); 

あなたは、代わりに#ifdef HAVE_FOO#if HAVE_FOOをチェックする必要があります、そして、あなたの--helpメッセージが表示されることがあります。代わりにHAVE_FOOを定義しないで、あなたは0にそれを定義

0

マクロを使用して別の前処理ディレクティブを作成することはできません。すべての前処理ディレクティブはマクロ展開が始まる前に認識されるため、マクロは誤ったCコードとして解釈されます。

関連する問題