19

私はプロジェクトの設定でこれらのいずれかを想定していました

  • TESTING=HOST
  • TESTING=TARGET
  • TESTINGまったく定義されていません

私の問題は後者にあります。

代わりに

#if TESTING==HOST
#error "HOST defined"  // add temporarilly for testing porpoises
#endif

コーディングする必要があります

#ifdef TESTING   
#if TESTING==HOST
#error "HOST defined"  // add temporarilly for testing porpoises
#endif
#endif

TESTINGifが定義されていない場合、それは確かに equalではなく、GCC コンパイラではHOSTその余分なものは必要ないため、これは標準的な動作ではないと確信しています。#ifdef TESTING

ただし、Atmel AVR Studio ( MS Visual Studio に基づいていると思います#ifdef TESTING) を使用する場合は、そのイニシャルを数十か所に追加する必要があります :-(

選択の余地がないように見えますが、C標準でこれが実際に必要かどうか疑問に思いました。

4

5 に答える 5

38
#if TESTING==HOST

TESTINGが定義されていない場合、

それは以下と同等です:

#if 0==HOST

C標準から:

(C99、6.10.1p4) 「マクロ展開と定義された単項演算子によるすべての置換が実行された後、残りのすべての識別子 (語彙的にキーワードと同一のものを含む) は pp-number 0 に置き換えられます」"

于 2012-10-30T23:45:30.173 に答える
11

そして、これを行うことができることに注意してください:

#ifndef TESTING
    ...
#elif TESTING == HOST
    ...
#elif TESTING == TARGET
    ...
#else
    #error "Unexpected value of TESTING."
#endif

また:

#if defined(TESTING) && TESTING == HOST
    ...
#endif

テストを折りたたむ場合。括弧はオプションです(#if defined TESTING有効です)が、特にロジックを追加し始める場合は、括弧を含める方が明確だと思います。

于 2012-10-31T00:11:33.207 に答える
3

元のCプリプロセッサ#ifdefでは、シンボルを使用する前に明示的な検証が必要でした。未定義のシンボルにデフォルト値があると想定するのは、比較的最近の革新です(おそらく、Javascriptなどのスクリプト言語によって推進されています)。

シンボルが定義されていることを常に保証しませんか?:

#ifndef TESTING
 #define TESTING  (default value)
#endif

#if TESTING==HOST
  ...
#elif TESTING==TARGET
 ...
#else
 ...
#endif

代わりに、多分選択を強制しますか?:

#ifndef TESTING
 #error You must define a value for TESTING
#endif
于 2012-10-30T23:47:11.047 に答える