#ifプリプロセッサディレクティブをC ++でネストできますか?


84

C ++のプリプロセッサディレクティブについて質問があります。

例えば:

#ifndef QUESTION

//some code here

#ifndef QUESTION

//some code here

#endif

#endif

私たちはこのようにそれを使用することができ、およびC ++コンパイラは、一致させることができますifndefし、endif正しい方法では?


1
条件文をネストしたり、あるマクロを別のマクロから呼び出すことはできますが、マクロを直接ネストすることはできませ#define AAA #define XXXん。たとえば、正しく機能しません。
SF。

2
Cの質問はこの質問の複製として閉じられたばかりなので少なくともこの質問に関する限り、CとC ++プリプロセッサのルールは同じであることを指摘しておきます。
キーストンプソン

回答:


112

はい、できます。#endif前回の声明の一致#if #ifdefまたは#ifndef対応がなかったためなど#endif

例えば

#if  ----------|
#if  -----|    |
#endif ---|    |
#endif --------|

ここには2つの#endifがあるので、最初の#endifは2番目の#ifndefと一致しますか?

前のものとは一致しません。それは私達それらを入れ子にすることができなかったことを意味するでしょう。
フレッドフー

49

はい、ネスト#if/#endifブロックできます。いくつかのCコーディングスタイルはあなたに書くように言うでしょう

#ifdef CONDITION1
# ifdef CONDITION2
# endif
#endif

スペースを使用してネストのレベルを示します。


5
ネスティングビットの+1は、明確にするのに役立つ場合があります。
アンドレキャロン2011

なぜスペースを挿入するのですか?なぜインデントしないのですか#ifdef
Jahid 2016

3
#プリプロセッサディレクティブが許可されている間のスペースすら知りませんでした。そのヒントに大いに感謝します!
AlexR 2017年

0

コードでは、#undef QUESTIONを実行しない限り、#ifndefQUESTIONセクションは破棄されます。

幸運を!


申し訳ありませんが、コードサンプルを読み間違えました!#ifdef QUESTION
bert-jan 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.