なぜ誰かが#if 1 C Preprocessorディレクティブを使用するのですか?
-
20-09-2019 - |
質問
私はいくつかを見ています c ソースコードと私は次の部分を理解していません
#if 1
typedef unsigned short PronId;
typedef unsigned short LMId;
# define LM_NGRAM_INT
#else
typedef unsigned int LMId;
typedef unsigned int PronId;
# undef LM_NGRAM_INT
#endif
なぜ誰かがするのでしょうか #if 1
?最初のブロックだけが処理されるのは本当ではありませんか?
解決
はい..最初のブロックのみが処理されます---誰かが1を0に変更するまで、他のブロックがコンパイルされます。これは、さまざまなアルゴリズムをテストしながら、コードの一時的なスイッチブロックを一時的に切り替えるための便利な方法です。
他のヒント
そのため、変更することでコンパイルするパーツをすばやく選択できるように #if 1
に #if 0
.
ソフトウェアの基本的な特性の1つは、それです コンピュータープログラムは変更が安価です.
そのため、特定のコードが変更を容易にするように書かれている理由です。そのため、「インターフェイス」や「プロキシ」などのさまざまなパターンが必要です。
そしてそれがあなたが時々の奇妙な構造を見る理由です #if 1
-#else
-#endif
, 、その唯一の目的は、小さな努力によって、コンパイルされるコードの部分を簡単に切り替えることです。1から0を変更します。
さまざまなパラメーターセットをテストする必要がある場合、コードにそれを置きます。通常、私の製品はデバッグ環境で操作できるものとは異なるデフォルトで出荷されるため、#if 1に配送デフォルトを配置し、デバッグがデバッグで構築されていることを警告する#Warningを使用して#ELSEのデバッグデフォルトを#ELSEに配置します。デフォルト。
さまざまなコードパスを実験するため。
これは、大きなコードをコメントするための別の方法であるため、エディターの自動インデンテーションはインデンテーションを破壊しません(コメントのブロックは、コードとしてではなく、テキストとしてインデントされます)。
私は実際にそれをクラッジとして使用して、コードの折りたたみを容易にします。コードのセクションをanでラップした場合 #if 1 ... #endif
, 、編集者に折りたたむことができます。 (問題のコードは非常にマクロが多いので、私によって書かれていないので、コードの巨大なブロックを管理可能にするためのより伝統的な方法は機能しません。)
それは別の言い方です #真であれば これは、以前に別のシンボルをチェックしていたコードの結果であり、その後、常に真であるようにリファクタリングされた結果であった可能性が高いです。
よりクリーンな方法は、おそらく次のようなことをすることです。
#if ALGO1
#else
#endif
ただし、Algo1をどこかでコンパイラArgsに渡す必要があります...たとえば、MakeFileでは、-dalgo1 = 1を追加する必要があります(1が提供されていない場合、1が想定されます)。参照: http://www.amath.unc.edu/sysadmin/doc4.0/c-compiler/user_guide/cc_options.doc.html
これはより多くの作業です...だから、通常、迅速なチェックのために、#if 1が使用されます。そして、場合によっては、忘れられ、取り残されたことも残されています:-)