C ++ 98、C ++ 11のクロスコンパイル可能なコードでオーバーライドを処理するエレガントな方法は?

IdeaHat

C ++ 0Xを検出しようとするオプションの組み込みコードを含むコードがいくつかあります。それが機能するふりをしましょう(この質問の範囲外であるプラットフォームをどのように悪く、どのようにクロスしないかについて議論します)。#defineがあるとしましょうDETECTCXX0XC ++ 0Xの場合。

これを行うのは、どれほどひどい考えですか。

#ifndef DETECTCXX0X
#define override
#endif

そして、あなたは何か選択肢がありますか?

(正しいことは、明示的なオーバーライドを使用しないことだと思います)。

bames53

Igor Tandetnikが指摘しているように、C ++ 11およびC ++ 98では次のように言うことは合法です。

int override = 10;

overrideC ++ 11でも実際にはキーワードではないからです。あなたのコードがこれをするなら、あなたのマクロはそれをC ++ 98モードで壊します。このような識別子の使用を禁止すると、メソッドは正常に機能します。唯一の問題は、そのルールを忘れて、エラーメッセージを理解するのが難しくなる可能性があることです。カスタマイズ可能なある種のリンターを使用している場合は、この問題を排除するルールを追加できます。

別のオプションは、プレトリアンのソリューションです。

#ifndef DETECTCXX0X
#define OVERRIDE
#else
#define OVERRIDE override
#endif

ただし、これにより、IMOというコードが醜く読みにくくなります。

あなたが以下をする贅沢を持っているなら、これは私がお勧めするものです:

#ifndef DETECTCXX0X
#error C++11 support required
#endif

C ++ 11以外のコンパイラを回避できない場合、そのリンターがある場合、2番目に良いオプションはそれを#define overrideと一緒に使用することです。3番目に良いのは、この特定のC ++ 11機能をまったく使用しないことです。私の見解では、最も望ましくないオプションは#define OVERRIDE overrideです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C ++でコンストラクターをオーバーロードするための適切でエレガントな方法は何ですか

分類Dev

C#コンパイラは明示的なキャスト演算子のオーバーロードをどのように処理しますか?

分類Dev

C ++コンパイルエラー:BからAに変換できない、コンストラクターがない、またはコンストラクターのオーバーロードのあいまいさ

分類Dev

c ++ 11スレッドでのコンパイルエラー

分類Dev

C ++でバイナリオブジェクトをエンコード/デコードする標準的な方法

分類Dev

私のc ++コードはマクロ+テンプレートのコンパイルで失敗しました、なぜこのエラーですか?

分類Dev

WDK、インテリセンス、C:「コマンドラインエラー:例外処理オプションは、C ++ドライバーのコンパイル時にのみ使用できます」

分類Dev

UIコントロールをバインドするのではなく、C#コード内からコマンドを呼び出す方法は?

分類Dev

C ++ file.cppをコンパイルできません。C ++ 98モード

分類Dev

C ++ -17では、このコンストラクターで可能なテンプレート推定ガイドはありますか?

分類Dev

C ++ 98とスレッド

分類Dev

C ++ 98とスレッド

分類Dev

C ++カスタムコンソールクラス-「<<」演算子がオーバーロードされていないオブジェクトを処理する方法は?

分類Dev

C ++のミックスインのようなパターンで機能をオーバーライドすることは可能ですか?

分類Dev

コンパイラエラーC1076およびC3859を処理するためのよりクリーンな方法はありますか?

分類Dev

C#コンパイラが無効なメソッドのオーバーロードを使用する理由

分類Dev

C#コンパイラが無効なメソッドのオーバーロードを使用する理由

分類Dev

godbolt(コンパイラエクスプローラ)でC ++モジュールをテストする方法は?

分類Dev

C ++スーパークラスコンストラクターで、サブクラスがオーバーライドする多くの変数に依存するコードを実行する正しい方法は何ですか?

分類Dev

c#ドライバーを使用してCassandraのリストコレクションにUDT要素を追加する適切な方法は何ですか?

分類Dev

ベクトルc ++ 98エラー

分類Dev

Delegateの戻り値がC#で処理されないのに、コンパイラエラーがスローされないのはなぜですか?

分類Dev

C ++の概念とテンプレートの特殊化。ユーザーフレンドリーなコンパイラエラーを取得する方法

分類Dev

Cカーネル用のCUDAデバイスの処理トレードオフを定量化する方法は?

分類Dev

GCCコンパイラがCコードをコンパイルしないのはなぜですか?

分類Dev

型の不一致エラーなしでこのコードがコンパイルされるのはなぜですか(C ++ 11)?

分類Dev

Visual Studio 2015(C ++):最初のビルドエラー(最初のプロジェクトではない)でコンパイルを停止します

分類Dev

GCC6.3が明示的なC ++ 11サポートなしでこのBraced-Init-Listコードをコンパイルするのはなぜですか?

分類Dev

'cp932' コーデックは位置 32 で文字 '\u98c8' をエンコードできません: 不正なマルチバイト シーケンス

Related 関連記事

  1. 1

    C ++でコンストラクターをオーバーロードするための適切でエレガントな方法は何ですか

  2. 2

    C#コンパイラは明示的なキャスト演算子のオーバーロードをどのように処理しますか?

  3. 3

    C ++コンパイルエラー:BからAに変換できない、コンストラクターがない、またはコンストラクターのオーバーロードのあいまいさ

  4. 4

    c ++ 11スレッドでのコンパイルエラー

  5. 5

    C ++でバイナリオブジェクトをエンコード/デコードする標準的な方法

  6. 6

    私のc ++コードはマクロ+テンプレートのコンパイルで失敗しました、なぜこのエラーですか?

  7. 7

    WDK、インテリセンス、C:「コマンドラインエラー:例外処理オプションは、C ++ドライバーのコンパイル時にのみ使用できます」

  8. 8

    UIコントロールをバインドするのではなく、C#コード内からコマンドを呼び出す方法は?

  9. 9

    C ++ file.cppをコンパイルできません。C ++ 98モード

  10. 10

    C ++ -17では、このコンストラクターで可能なテンプレート推定ガイドはありますか?

  11. 11

    C ++ 98とスレッド

  12. 12

    C ++ 98とスレッド

  13. 13

    C ++カスタムコンソールクラス-「<<」演算子がオーバーロードされていないオブジェクトを処理する方法は?

  14. 14

    C ++のミックスインのようなパターンで機能をオーバーライドすることは可能ですか?

  15. 15

    コンパイラエラーC1076およびC3859を処理するためのよりクリーンな方法はありますか?

  16. 16

    C#コンパイラが無効なメソッドのオーバーロードを使用する理由

  17. 17

    C#コンパイラが無効なメソッドのオーバーロードを使用する理由

  18. 18

    godbolt(コンパイラエクスプローラ)でC ++モジュールをテストする方法は?

  19. 19

    C ++スーパークラスコンストラクターで、サブクラスがオーバーライドする多くの変数に依存するコードを実行する正しい方法は何ですか?

  20. 20

    c#ドライバーを使用してCassandraのリストコレクションにUDT要素を追加する適切な方法は何ですか?

  21. 21

    ベクトルc ++ 98エラー

  22. 22

    Delegateの戻り値がC#で処理されないのに、コンパイラエラーがスローされないのはなぜですか?

  23. 23

    C ++の概念とテンプレートの特殊化。ユーザーフレンドリーなコンパイラエラーを取得する方法

  24. 24

    Cカーネル用のCUDAデバイスの処理トレードオフを定量化する方法は?

  25. 25

    GCCコンパイラがCコードをコンパイルしないのはなぜですか?

  26. 26

    型の不一致エラーなしでこのコードがコンパイルされるのはなぜですか(C ++ 11)?

  27. 27

    Visual Studio 2015(C ++):最初のビルドエラー(最初のプロジェクトではない)でコンパイルを停止します

  28. 28

    GCC6.3が明示的なC ++ 11サポートなしでこのBraced-Init-Listコードをコンパイルするのはなぜですか?

  29. 29

    'cp932' コーデックは位置 32 で文字 '\u98c8' をエンコードできません: 不正なマルチバイト シーケンス

ホットタグ

アーカイブ