【发布时间】:2012-03-26 17:07:37
【问题描述】:
我正在使用 g++ 编写一个 64 位操作系统,并且我有一个可变参数函数,例如:
void DbgPrint(const char *fmt, ...);
其行为与 printf 非常相似。 这里的问题是 g++ 遵循 System V ABI,因此它传递 RDI、RSI、RDX、RCX、R8、R9 中的第一个参数,然后将剩余的(如果有)压入堆栈。
在 cdecl 中使用旧的 stdarg.h 宏 va_start、va_arg 等非常容易,因为 va_arg 只是获取堆栈中的下一个元素。但是现在这些宏在第 7 个参数之前根本不起作用。
唯一可能的解决方案是(恕我直言):
- 强制 g++ 创建 cdecl 函数。这似乎是不可能的,因为 __attribute__((cdecl)) 被故意清晰地突出显示为忽略。
- 拥有一组新的宏,可以使用新的参数传递方式。
(我实际上正在开发 Win,所以我没有 glibc 标头来检查它们的实现)。
谁有解决方案?提前致谢。
【问题讨论】:
标签: c variadic-functions cdecl