C++標準に基づいて以下のような法律が適用されますか? (答えは標準に標準と異なる場合は、私はあまりにも、それを知っていると思います。)目標は、私がトップレベルで呼び出し、セミコロンに従うことができますマクロを定義することであるトップレベルのno-opをC++で定義していますか?
#define VERY_OLD_COMPILER 1
#ifdef VERY_OLD_COMPILER
#define USING_NAMESPACE_STD enum { }
#else
#define USING_NAMESPACE_STD using namespace std
#endif
USING_NAMESPACE_STD;
int main(int argc, char *argv[]) {
// etc.
、それは効果がないように。私は、トップレベルの迷惑セミコロンが許可されていないことを確信しています(GCCは、とにかくそれについて不平を言います)。単に空のマクロを定義するだけではうまくいきません。
空の匿名構造体を宣言すると、名前が必要なため、名前空間を汚染したくないため、機能しません。
匿名の空の列挙宣言(enum { }
)がこのトリックを行いますか?私が試したすべてのコンパイラで動作しますが、もちろんそれは仕様で許可されているものと同じではありません。
他のアイデアやコメントを歓迎します。まあ、 "コンパイラを投げる"以外の何か。私を信じて、私はしたいです。
セミコロンでマクロ呼び出しを続けなければならないのはなぜですか?あなたがそれをやっていないなら、これは解決するのが簡単ではないでしょうか? –
@Greg:個人的な好み。私は関数内で 'DO_STUFF(x、y);'のようなマクロを呼び出すことに慣れています、そして、私はそのようなノーオペレーションを書く方法を知っています。私は 'USING_NAMESPACE_STD'はこれの良い名前だと思うし、最後にセミコロンを置くと自然に見えるので、それは私が望むものだと思う。私はそれが仕様で定義されている言語で可能かどうか不思議です。 – Nemo
私は、末尾のセミコロンを好むことに同意するでしょう。セミコロンの後に続かないステートメントのようなマクロを使用する必要がある場合がありますが、それを避けることができる場合は、そうする必要があります。 –