2

経験的に次の動作 (gcc および VC++) ですが、有効で移植可能なコードですか?

typedef struct 
{
    int w[2];
} A;

struct B
{
    int blah[2];
};

void my_func(B b)
{
    using namespace std;
    cout << b.blah[0] << b.blah[1] << endl;
}

int main(int argc, char* argv[])
{

    using namespace std;

    A a;
    a.w[0] = 1;
    a.w[1] = 2;

    cout << a.w[0] << a.w[1] << endl;

    // my_func(a);                     // compiler error, as expected
    my_func(reinterpret_cast<B&>(a));  // reinterpret, magic?
    my_func(  *(B*)(&a) );             // is this equivalent? 

    return 0;
}
// Output:
// 12
// 12
// 12
  • reinterpret_cast は有効ですか?
  • C スタイルのキャストは同等ですか?
  • &aビットをタイプ B として解釈することを意図している場合、これは有効な/最善のアプローチですか?

(トピック外:なぜ私がこれをやろうとしているのか知りたい人のために、私は 128 ビットのメモリを必要とする 2 つの C ライブラリを扱っており、異なる内部名を持つ構造体を使用しています - 私の例の構造体によく似ています.私は memcopy を使いたくありませんし、サードパーティのコードをハックしたくありません。)

4

1 に答える 1

2

C ++ 11では、2つのタイプがレイアウト互換である場合、これは完全に許可されます。これは、同一で標準レイアウトの構造体に当てはまります。詳細については、この回答を参照してください

以前のバージョンのC++では、2つの構造体を同じ共用体に固定することもできます。これにより、異なる構造体タイプに対して同じ順序で同一のデータメンバー(データメンバーの「共通の初期シーケンス」)にアクセスできることが保証されました。

この場合、はい、Cスタイルのキャストは同等ですが、reinterpret_castおそらくより慣用的です。

于 2012-04-18T06:39:43.327 に答える