ではC / C ++
#if 0
/ #endif
ブロックの間に置かれたコードはどうなりますか?
#if 0
//Code goes here
#endif
コードは単にスキップされるため、実行されませんか?
ではC / C ++
#if 0
/ #endif
ブロックの間に置かれたコードはどうなりますか?
#if 0
//Code goes here
#endif
コードは単にスキップされるため、実行されませんか?
回答:
実行されないだけでなく、コンパイルもされません。
#if
実際のコンパイル手順の前に評価されるプリプロセッサコマンドです。そのブロック内のコードは、コンパイルされたバイナリには表示されません。
多くの場合、後で再び有効にするためにコードのセグメントを一時的に削除するために使用されます。
これは、ブロックをコメントアウトすることと同じですが、重要な違いが1つあります。ネスティングは問題ではありません。このコードを考えてみましょう:
foo();
bar(x, y); /* x must not be NULL */
baz();
コメントアウトしたい場合は、以下を試してみます。
/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/
Bzzt。構文エラー!どうして?ブロックコメントはネストされないため(SOの構文の強調表示からわかるように)*/
、単語 "NULL"の後はコメントを終了し、baz
呼び出しはコメント化されず、構文エラーの*/
後にbaz
なります。一方:
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
全体をコメントアウトするように機能します。そして、#if 0
sは次のように互いにネストします。
#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif
もちろん、これは少し混乱する可能性があり、適切にコメントしないとメンテナンスの頭痛になる可能性があります。
foo.c:3: unterminated string or character constant
はgccから入手しました、何を使っていますか?
プリプロセッサは#ifを見ると、次のトークンにゼロ以外の値があるかどうかをチェックします。含まれている場合は、コンパイラのコードを保持します。そうでない場合は、そのコードが削除されるため、コンパイラーはそのコードを認識しません。
誰かが#if 0と言った場合、コードをコメントアウトしているため、コンパイルされることはありません。これは、彼らが/ * ... * /を囲んでいるかのように考えることができます。まったく同じではありませんが、効果は同じです。
何が起こったかを詳しく知りたい場合は、よく見ることができます。多くのコンパイラーでは、プリプロセッサーの実行後にファイルを表示できます。たとえば、Visual C ++では、スイッチ/ Pコマンドはプリプロセッサを実行し、結果を.iファイルに書き込みます。
#if WIN32 || __CYGWIN__
、これは期待通りに機能します。
aで始まる行#
は、プリプロセッサディレクティブです。 #if 0 [...] #endif
ブロックはコンパイラに到達せず、マシンコードを生成しません。
ソースファイルを使用してプリプロセッサで何が起こるかを示すことができますifdef.cxx
。
#if 0
This code will not be compiled
#else
int i = 0;
#endif
実行gcc -E ifdef.cxx
すると、何がコンパイルされるかが表示されます。
このメカニズムを使用して、開発サイクル中にコードのブロックがコンパイルされないようにすることもできますが、コードに粗末が追加されて読みやすさが低下するため、ソース管理にチェックインしたくない場合があります。コメント化されているコードの履歴部分である場合は、削除する必要があります。ソース管理には履歴が含まれていますよね?
また、答えはCとC ++の両方で同じかもしれませんが、C / C ++と呼ばれる言語はなく、そのような言語を参照するのは良い習慣ではありません。
かなり
int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}
gcc 4.2.4で「tc:4:19:警告:終了文字 'がありません」が表示されます
//
先頭にプレフィックスを付けるか、セクションをで始めてセクションを/*
で終わる必要があり*/
ます。後者の手法の問題は、コメントがネストされないため、開発者*/
は開始と終了の間をチェックして処理する必要があることです。