私たちのプロジェクトにはかなり普通に見える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 で機能する理由を誰か説明できますか? 適切なドキュメントへのポインタをいただければ幸いです。