1

在我们的项目中,我们有一个看起来很正常的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 吗?非常感谢您提供指向相应文档的指针!

4

1 回答 1

1

我想我在MSDN上找到了一些说明:

任何不适合 8 个字节或不是 1、2、4 或 8 个字节的参数都必须通过引用传递。

看来是时候修复clang了!

于 2011-02-21T22:41:57.493 回答