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