古いC ++コンパイラが新しいキーワードを実装していない場合、それを定義するのは間違っていますか?

ルイージバラビオ

古いコンパイラでまだサポートされているライブラリを維持しています。その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]

編集
0

コメントを追加

0

関連記事

分類Dev

この場合、clangが間違っているか、gccが間違っているか、またはその両方が間違っていますか?メンバーポインタでconstnessをキャストします

分類Dev

実装エラーを実行します。それは私のコーディングが間違っていますか?

分類Dev

クラスがフィールドのタイプがdisposeパターンを実装するフィールドを定義している場合、常にdisposeパターンを実装する必要がありますか?c#

分類Dev

マシンが機能していないが、古いドライブを新しいドライブにマウントできる場合、MySQLとApacheのデータと設定を移行するにはどうすればよいですか?

分類Dev

パスワードが間違っている場合、ノードの暗号解読は常にエラーをスローしますか?

分類Dev

動作が定義されていないC ++コード、コンパイラはstd :: exceptionを生成します

分類Dev

cdkがインストールされていない場合、つまりnpm run cdkを使用して、コンテキストパラメータを使用してcdkコマンドを実行するにはどうすればよいですか?

分類Dev

値のタイプがキーに依存しているが、すべてのキーが事前にわかっているわけではない場合、インターフェイスを定義するにはどうすればよいですか?

分類Dev

ベースインターフェイスを作成してそこから実装したい場合、次のメソッドまたはプロパティ間で呼び出しがあいまいになります

分類Dev

ヘッダーが間違って設定されている場合は、本文からJSONを解析します

分類Dev

別のポインターがその参照を指している場合、const intがコンパイラーによって(シンボルテーブルを介して)最適化されないのはなぜですか?

分類Dev

インターフェイス/構造体「X、間違ったタイプ、またはメソッドを実装していない。なぜこのエラーが発生するのかわからない

分類Dev

winapi:SetFocus()はエラーなしでNULLを返すことができますか?それは、フォーカスを実装するときに私が見ているものであるため、最近の古い新しい投稿を復元します

分類Dev

Sympyを使ってコードを実行したい。しかし、それはそのようなモジュールがないと言っています

分類Dev

何かが常に間違っている場合、それはコンパイルされますか?

分類Dev

クラスがハッシュマップのキーとして使用されていない場合、ハッシュコードをオーバーライドする実用的なポイントはありますか?

分類Dev

実際に `sudo`を必要としないコマンドが与えられた場合、sudoはどのようにしてパスワードを要求するかどうかを決定しますか?

分類Dev

Javaでフラグを定義し、それらのフラグが定義されている場合にのみコードを実行する方法はありますか?

分類Dev

JavaScriptがクラシック継承をサポートしていない場合、コンストラクターを作成して新しいキーワードを使用できるのはなぜですか?

分類Dev

フラッターログインフォームでパスワードまたはユーザーの電子メールが間違っている場合はエラーメッセージを返します

分類Dev

非表示が意図されている場合は、新しいキーワードを使用します-ContextMenu XAML

分類Dev

ArrayAccessを実装するクラスは、最初に定義されていない場合、致命的なエラーをスローします

分類Dev

AngularJSモデルで。(dot)を使用していない場合、それは間違っていますか?

分類Dev

Android:アプリがバックラウンドで実行されている場合、ヘッダーのアイコンが間違っています

分類Dev

シートのコードビハインドが「プロキシ」インターフェイス+クラスに実装されている場合、ワークシートイベントを適切に処理します

分類Dev

コンパイラは間違ったタイプについて文句を言いますが、それは明らかに正しいです

分類Dev

Windows 8へのアップグレードを実行している場合、以前のバージョンをインストールする必要がありますか、それともキーを十分に持っているだけですか?

分類Dev

gccは私のコードを間違ってコンパイルしているようですか?

分類Dev

配列を定義するために `New`キーワードを使用する場合と使用しない場合の違いは何ですか?

Related 関連記事

  1. 1

    この場合、clangが間違っているか、gccが間違っているか、またはその両方が間違っていますか?メンバーポインタでconstnessをキャストします

  2. 2

    実装エラーを実行します。それは私のコーディングが間違っていますか?

  3. 3

    クラスがフィールドのタイプがdisposeパターンを実装するフィールドを定義している場合、常にdisposeパターンを実装する必要がありますか?c#

  4. 4

    マシンが機能していないが、古いドライブを新しいドライブにマウントできる場合、MySQLとApacheのデータと設定を移行するにはどうすればよいですか?

  5. 5

    パスワードが間違っている場合、ノードの暗号解読は常にエラーをスローしますか?

  6. 6

    動作が定義されていないC ++コード、コンパイラはstd :: exceptionを生成します

  7. 7

    cdkがインストールされていない場合、つまりnpm run cdkを使用して、コンテキストパラメータを使用してcdkコマンドを実行するにはどうすればよいですか?

  8. 8

    値のタイプがキーに依存しているが、すべてのキーが事前にわかっているわけではない場合、インターフェイスを定義するにはどうすればよいですか?

  9. 9

    ベースインターフェイスを作成してそこから実装したい場合、次のメソッドまたはプロパティ間で呼び出しがあいまいになります

  10. 10

    ヘッダーが間違って設定されている場合は、本文からJSONを解析します

  11. 11

    別のポインターがその参照を指している場合、const intがコンパイラーによって(シンボルテーブルを介して)最適化されないのはなぜですか?

  12. 12

    インターフェイス/構造体「X、間違ったタイプ、またはメソッドを実装していない。なぜこのエラーが発生するのかわからない

  13. 13

    winapi:SetFocus()はエラーなしでNULLを返すことができますか?それは、フォーカスを実装するときに私が見ているものであるため、最近の古い新しい投稿を復元します

  14. 14

    Sympyを使ってコードを実行したい。しかし、それはそのようなモジュールがないと言っています

  15. 15

    何かが常に間違っている場合、それはコンパイルされますか?

  16. 16

    クラスがハッシュマップのキーとして使用されていない場合、ハッシュコードをオーバーライドする実用的なポイントはありますか?

  17. 17

    実際に `sudo`を必要としないコマンドが与えられた場合、sudoはどのようにしてパスワードを要求するかどうかを決定しますか?

  18. 18

    Javaでフラグを定義し、それらのフラグが定義されている場合にのみコードを実行する方法はありますか?

  19. 19

    JavaScriptがクラシック継承をサポートしていない場合、コンストラクターを作成して新しいキーワードを使用できるのはなぜですか?

  20. 20

    フラッターログインフォームでパスワードまたはユーザーの電子メールが間違っている場合はエラーメッセージを返します

  21. 21

    非表示が意図されている場合は、新しいキーワードを使用します-ContextMenu XAML

  22. 22

    ArrayAccessを実装するクラスは、最初に定義されていない場合、致命的なエラーをスローします

  23. 23

    AngularJSモデルで。(dot)を使用していない場合、それは間違っていますか?

  24. 24

    Android:アプリがバックラウンドで実行されている場合、ヘッダーのアイコンが間違っています

  25. 25

    シートのコードビハインドが「プロキシ」インターフェイス+クラスに実装されている場合、ワークシートイベントを適切に処理します

  26. 26

    コンパイラは間違ったタイプについて文句を言いますが、それは明らかに正しいです

  27. 27

    Windows 8へのアップグレードを実行している場合、以前のバージョンをインストールする必要がありますか、それともキーを十分に持っているだけですか?

  28. 28

    gccは私のコードを間違ってコンパイルしているようですか?

  29. 29

    配列を定義するために `New`キーワードを使用する場合と使用しない場合の違いは何ですか?

ホットタグ

アーカイブ