1

C++11 では、このような共用体を作成できるようになりました

union U {
   int z;
   std::vector<char> data;
};

この構造体を通常の C 共用体を受け入れる C ライブラリに渡すことはできますか? どのように?

4

1 に答える 1

2

その組合を通過できますか?いいえstd::vector(および を除く他のすべての標準コンテナー) は、既知のレイアウトstd::arrayの型を生成しません。標準のレイアウト タイプの場合もありますが、標準では特定のレイアウトは示されていません。したがって、C に渡すことはできません。

注: 「C に渡す」とは、「C コードがデータにアクセスできるように、同じメモリ レイアウトを持つ同等の C 構造を構築する」という意味だと思います。

ただし、すべての型が標準レイアウト型である限り、既知のレイアウトの型を含む任意の共用体を渡すことができます。それらは些細なものである必要はありませんが、標準的なレイアウトでなければなりません。

また、コンパイラ固有であることを気にしない場合は、特定std::vectorの実装を調べて (または のような特定の実装を使用してboost::vector)、本質的に同じデータを格納する同等の C 構造を考案できます。もちろん、これは特定の実装が実際に標準レイアウトであることを前提としています。C++ 標準はそれを要求しておらず、アロケータの存在によってこれが変わる可能性があります。

于 2012-04-10T00:37:33.813 に答える