2015-11-17 1 views
14

私はいくつかのブール型マクロの定義を含むいくつかの構成ファイルを持っており、0または1に設定されています。コードのどの部分を有効にするかを決定します。ここで難しい部分があります:私は、マクロの定義を含むヘッダーが含まれていることを確認したいと思います。チェックされているとエラーを生成するブール型マクロが定義されていない

次の例では、FOO定義を含むヘッダーファイルを含めるのを忘れた場合、コンパイラは "world!"を出力しますが、代わりにエラーが発生します。

//in the configuration header file 
#define FOO 1 

//in a cpp file 
#if FOO //I would like this to generate an error if I forgot to include the header file 
#pragma message "Hello" 
#else 
#pragma message "world!" 
#endif 

このような動作は可能ですか?どうやって?明確にするために

、私はhow to generate an error if a macro is not definedを求めていないのですが、それはそのよう#if FOOラインを変換することが可能である場合には、同時に、それはブール値をチェックし、FOOが定義されていない場合は、エラーを生成します。

これを持っていることのポイントは、開発者が自分のコードが

それは #if FOOの文であるかのように、同時に、FOOのブール値をチェックし、
SPECIAL_MACRO(FOO) 

、および防止が含まれている必要があることを知っているだろうということでしょう彼らはFOOを定義するヘッダーの包含を忘れていないからです。

+0

C++ 11以降、 'static_assert'を使うことができます –

+2

なぜ'#ifdef'を使わないのですか? – Petr

+0

[Cプリプロセッサでエラーと警告を生成する方法は?](http:// stackoverflow。コム/質問/ 2221517 /ハウツー-生成-エラーと警告・イン・Cプリプロセッサ) –

答えて

19

#defineで広範囲に構成された大きなコードベースを維持していた同僚(Hartmut、Kurt)は、まったく同じ問題に遭遇しました。シンプルな誤字は、おそらくメイクファイルにあり、追跡が困難な微妙なエラーが発生する可能性があります。彼らの解決策:機能マクロを使用してください!定義されていない場合、0に置き換えられます単純SOME_CONDとは対照的にSOME_COND()は、定義されていない場合、コンパイラは文句

#if SOME_COND() 
// ... 
#endif 

います。私はそれが追加の#ifdefとコードを混乱させることなくいくつかの値を転送するために使用できるので、それが好きです。

+1

:-)彼らは良いプログラマです。あなたの車のOEMナビゲーションをオンにすると、そのソフトウェアを使用している可能性があります。 –

+0

SOME_CONDの定義方法の例を表示できますか? –

+0

@DanKorn最高レベルには、他のプリプロセッサ関数マクロ定義が含まれていました。後で、通常のソースファイルでは、コードの一部または異なる変数値のコメントアウトを行います。 –

0

私は単純なトリッキーな解決策であなたの問題を解決できると思います。私は以下のようにあなたのコードを変更し、私のコードはheader.hが存在せず、私にエラーを表示することを理解しています。

#if FOO == 1 
    #pragma message "Hello" 
#elif FOO == 2 
    #pragma message "world!" 
#else 
    throw std::invalid_argument("Header didn't add to project"); 
#endif 

あなたはFooの初期値を変更する必要があります。 FOOが見つからないときにコンパイラがFoo == 0を有効にするため、設定に0の値を使用しないでください。あなたはゼロ(1,2,3、...)より大きい値を使用する必要があります。

Foo == 0不在の状況。

フー== 1構成1.

フー== 2構成2

+0

申し訳ありませんが、私の答えは繰り返していると思います。私はそれを遅く知っている。 – hamed