は、次のコードを考えてみましょう。この場合なぜCプリプロセッサはスキップしたブロック内の無効なディレクティブを無視しないのですか?
#if 0
#foobar
#endif
を、プリプロセッサは、#foobar
が有効なプリプロセッサディレクティブではないことを文句はありません。 #if 0
のためにブロックをスキップするだけで、コードは正常にコンパイルされます。
今すぐ次のコードを考えてみます。
#if 0
#if 1
#endif
この場合は、プリプロセッサが突然行方不明#endif
ディレクティブがあることを訴えます。 #if 0
の場合であっても、プリプロセッサは#if 0
ブロックにあるものを完全に無視しているようには見えないので、混乱しています。 #if
ディレクティブが解析されているようで、プリプロセッサはその正確さを強制します。つまり、スキップされたブロックでも#endif
で一致する必要があります。
以前、私は#if 0
/#endif
使用してブロックをカプセル化すること/*
と*/
を使用して、それをコメントに相当したという印象でした。しかし、それは明らかにそうではありません。したがって
私の質問:
この設計の論理的根拠は何ですか?プリプロセッサは、
#if 0
のような特定のディレクティブを使用してスキップするようにプリプロセッサに明示的に指示されているブロックであっても、#if
ディレクティブを正しく一致させるのはなぜですか?正確にのディレクティブは、
#if 0
ブロックで処理されますか。上記の例に示すように、プリプロセッサは無効なプリプロセッサディレクティブ(#foobar
)には言及しませんが、不一致の#if
ディレクティブについては不平を言います。したがって、どのプリプロセッサディレクティブが実際に#if 0
ブロックで処理されますか?#if
/#ifdef
/#elif
/#else
/#endif
のみ、または#if 0
ブロックで処理されるディレクティブがさらにありますか?
プリプロセッサは* which * '#if'に' #endif'がありません。インデントはそれを伝えません! 2番目の例では、 '#endif'をインデントするとエラーメッセージが表示されますか? –
プリプロセッサ*は、取られていないブランチの内部でも '#if' /' #endif'指示文を見る*を持っています。そうしないと、 '#if'はおそらく動作しません。 –
D'oh、そうです、もちろん意味があります。なぜそれがそうでなければならないのかは非常に明白です。さて、私はクリスマスにそれを非難してみましょう:) – Andreas