在我们的项目中,我们有一个看起来很正常的printf
样式函数,修改后的%g
格式意味着打印 GUID 而不是普通的浮点类型。对于我们的例子,GUID 看起来像这样:
struct guid {
uint32_t Data1;
uint16_t Data2;
uint16_t Data3;
uint8_t Data4[8];
};
实际上,打印函数期望传递一个指向 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 时,它肯定不会做同样的事情。
有人可以解释为什么第二个版本的调用适用于 MSVC 吗?非常感谢您提供指向相应文档的指针!