0
  1. [バイナリ]これを行うのは安全ですか?

    struct Foo {
    
        #if __cplusplus > 199711L
            Foo( std::initializer_list<int> & list ) {
                /* ... */
            }
        #endif
    
    };
    

    このトピックを見たことがありますが、OP の元の質問には回答がありません。

  2. この動作を達成するためのより良い方法はありますか?

4

2 に答える 2

0

おそらく問題ないでしょう。DirectX 構造体はこのように実装されていますが、C と C++ の両方をサポートするために行われています。

于 2012-07-27T15:18:28.667 に答える
0

私はあなたが次のことを想定しています:

  • そのようなコードをライブラリにコンパイルしている、コンパイラをアップグレードしていて、現在 C++11 でコードをコンパイルしたい (またはコードがないためにコンパイルできない)、または、

  • C++11 より前のライブラリに既にコードがあり、コンパイラをアップグレードしたので、上記のコードを使用して古いライブラリと「互換性」を持たせたい、または、

  • C++11 なしでコードをコンパイルし、同じコンパイラを使用して C++11 でコンパイルされたコードとリンクしたい。

いずれの場合も、答えは C++ に関する質問ではなく、コンパイラの ABI に関する質問です。これは、(i) リンク フェーズが機能するかどうか、および (ii) クラスのランタイム フォームなどがまだ機能しているかどうかに関係するためです。コンパイラ/バージョン/コンパイラ設定の間で有効です。

そのため、使用しているコンパイラのドキュメントを調べて、「バイナリセーフ」かどうかを確認する必要があります。

注 #1:コンパイラが例外処理の発行されたコード設計、クラスの RTTI レイアウト、および/または名前マングリング スキームを何らかの方法で変更した場合、あなたの答えは「いいえ、安全ではありません」です。 ." しかし、これらはおそらく唯一のケースではありません。

注 2:同じコンパイラで異なる設定 (たとえば、C++11 を使用する場合と使用しない場合) を使用している場合、技術的には、一部のモジュールのコードを除外して他のモジュールのコードを保持する場合、ODR (1 つの定義規則) の仮定に違反しています。同じプログラム。この場合、結果は技術的に実装定義されますが、仮想ではないため、1 つのコンパイラの 1 つのバージョンのみが使用されている場合、ほとんどのコンパイラで動作する可能性が非常に非常に高くなります。

于 2012-07-28T20:42:23.887 に答える