古いコンパイラでまだサポートされているライブラリを維持しています。その1つがWindows上のVisualC ++ 2013です。これまでのところ、私たちは非常に保守的で、C ++ 03に固執してきました。現在、C ++ 11に移行しています。VC ++ 2013はほとんどの新機能をサポートしていますが、を認識しませんnoexcept
。
もちろん、それをコードに追加するための標準的な方法は、次のようなものを定義することです。
#if (the compiler does not support it)
#define NOEXCEPT
#else
#define NOEXCEPT noexcept
#endif
そしてそれを次のように使用します
void f() NOEXCEPT;
もちろん、欠点は、コードの周りにマクロを散在させていることです。
しかし、私も書くことができると思いました(おそらく私の肩の小さな守護悪魔によって示唆されました)
#if (the compiler does not support it)
#define noexcept
#endif
その後、私は書くことができました
void f() noexcept;
また、キーワードは新しいコンパイラで正しく使用され、古いコンパイラでは定義されません。
これは(正常にコンパイルされたように)機能しましたが、まあ、私はちょっと汚い感じがします—そして私はそうすべきかどうかわかりません。もちろん、キーワードを定義することは、それを定義する標準の下で禁止されています。しかし、コンパイラが標準を完全にサポートしていない場合でもそうですか、それとも私はある種の灰色の領域にいますか?
古い標準ではキーワードではなかったので、古い標準をターゲットにするときに、技術的にはそのようなマクロを定義することができます。
PS C ++ 11より前の一般的な定義はthrow()
、の代わりに使用することですnoexcept
。
PPSの場合noexcept
、マクロは次のような宣言では機能しないことに注意してください。
void foo() noexcept(false);
bool bar = noexcept(foo());
したがって、これらのステートメントを簡単に下位互換性を持たせることはできません。のすべてのユースケースをサポートできないことを考えると、noexcept
マクロに異なる名前を使用すると、混乱を避けるのに役立つ場合があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加