23

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ですか?最初のブロックだけが処理されるというのは本当ですか?

4

9 に答える 9

27

はい..最初のブロックのみが処理されます --- 誰かが 1 を 0 に変更するまで。その後、他のブロックがコンパイルされます。これは、さまざまなアルゴリズムをテストしながら、コードのブロックを一時的に切り替える便利な方法です。

于 2010-02-15T13:06:27.177 に答える
18

に変更することで、コンパイルする部分をすばやく選択できるようにし#if 1ます#if 0

于 2010-02-15T13:06:39.723 に答える
6

ソフトウェアの基本的な特性の 1 つは、コンピューター プログラムは安価に変更できることです。

そのため、特定のコードは、変更が容易になるように記述されています。そのため、「インターフェース」や「プロキシ」など、さまざまなパターンが必要です。

そのため、コンパイルされるコードの一部を簡単に切り替えることが唯一の目的である#if 1- #else-のような奇妙な構造が時々見られます: 1 を 0 に変更します。#endif

于 2010-02-15T13:13:41.727 に答える
5

さまざまなパラメーターのセットをテストする必要があるときに、それをコードに入れます。通常、私の製品は、デバッグ環境で使用できるものとは異なるデフォルトで出荷されるため、出荷時のデフォルトを #if 1 に入れ、デバッグのデフォルトを #else に入れ、デバッグでビルドされていることを警告する #warning を付けます。デフォルト。

于 2010-02-15T13:08:23.257 に答える
4

さまざまなコード パスを試すため。

于 2010-02-15T13:06:18.720 に答える
3

これは、大きなコードをコメント アウトする別の方法であるため、エディターの自動インデントはインデントを壊しません (コメントされたコード ブロックは、コードではなくテキストとしてインデントされます)。

于 2010-04-11T12:52:04.413 に答える
2

それを行うためのよりクリーンな方法は、おそらく次のようなことです。

#if ALGO1

#else

#endif

ただし、どこかのコンパイラ引数に ALGO1 を渡す必要があります...たとえば、makefile で -DALGO1=1 を追加する必要があります (1 が指定されていない場合は、1 が想定されます)。参照: http://www.amath.unc.edu/sysadmin/DOC4.0/c-compiler/user_guide/cc_options.doc.html

これはより多くの作業です...そのため、通常、簡単なチェックのために #if 1 が使用されます。そして場合によっては、忘れられて置き去りにされます:-)

于 2013-07-31T16:02:34.800 に答える
1

#if trueについて別の言い方をすると、以前に別のシンボルをチェックしていたコードが常に true になるようにリファクタリングされた結果である可能性が最も高いです。

于 2010-02-15T13:06:51.183 に答える