1

私たちのプロジェクトにはかなり普通に見えるprintfスタイルの関数がありますが、%g形式が通常の浮動小数点型の代わりに GUID を出力することを意味するように変更されています。この場合、GUID は次のようになります。

struct guid {
  uint32_t  Data1;
  uint16_t  Data2;
  uint16_t  Data3;
  uint8_t   Data4[8];
};

実際には、print 関数は、構造自体ではなく、GUID へのポインターが渡されることを想定しています。

struct guid myGuid = { 0x867FD1E7, 0x9AA7, 0x472A, { 0xAA, 0x56, 0xF2, 0xDA, 0x66, 0x62, 0xCD, 0x4D } };
print("%g", &myGuid);

ただし、ソース ベースにはいくつかの場所があり、何らかの理由で GUID 全体が渡されます。

print("%g", myGuid);

このスタイルの呼び出しは MSVC2003 で正常に動作するようです - コンパイラがその関数呼び出しスタイルを変換して実際に舞台裏でポインターを渡すようにする ABI 要件はありますか? このコードベースを clang/llvm を使用するように移植すると、確かに同じことは起こりません。

2 番目のバージョンの呼び出しが MSVC で機能する理由を誰か説明できますか? 適切なドキュメントへのポインタをいただければ幸いです。

4

1 に答える 1

1

MSDNでいくつかの説明を見つけたと思います:

8 バイトに収まらない、または 1、2、4、または 8 バイトではない引数は、参照によって渡される必要があります。

クランを修正する時が来たようです!

于 2011-02-21T22:41:57.493 に答える