7

長い倍精度フィールドを持つユニオンがあります。

フィールドを初期化して関数に渡します。

my_union foo;
foo.long_double = 10.10;
bar = baz(foo);

このコードをコンパイルすると、次のようになります。

the ABI of passing union with long double has changed in GCC 4.4

ここで言及されている変更に関連しているようです: http://gcc.gnu.org/gcc-4.4/changes.html

これは、フィールドとして long double を持つ共用体を渡すことができないということですか? どうしてこれなの?大きな値を格納するために long double を使用したいので、どうすればこれを解決できますか。

4

2 に答える 2

9

これが意味することは、結果のコードが以前のバージョンの GCC でコンパイルされたコードとバイナリ互換性がないということです。そのため、現在のバージョンと以前のバージョンでコンパイルされたバイナリ間でライブラリ間でコードを渡す場合、動作しません。(ネットワーク トランスポートとファイルへの保存のメモリ レイアウトに関する情報については、コメントを参照してください)

あなたが提供したリンクからわかるように:

Code built with previous versions of GCC that uses any of these is not compatible with code built with GCC 4.4.0 or later.

そうしないか、変更ログに記載されている共用体を使用するすべてのコードが同じコンパイラ バージョン (または技術的には ABI) でコンパイルされていることを確認してください。

http://en.wikipedia.org/wiki/Application_binary_interface

于 2013-05-30T08:07:01.267 に答える
0

コンパイル中にオプション -msse2 または -march=k8 を使用してみてください

于 2013-05-30T08:10:43.347 に答える