gpt4 book ai didi

C++ 为什么 va_start 期望最后一个非可变函数参数?

转载 作者:太空宇宙 更新时间:2023-11-04 02:58:34 26 4
gpt4 key购买 nike

我正在使用 Visual Studio 2012 编译此示例代码:

#include <stdarg.h>
#include <stdio.h>

const char * __cdecl foo(const char * format, const char * requiredArgument, ...)
{
va_list args;
va_start(args, format);
vprintf(format, args);
va_end(args);
return requiredArgument;
}

int main(int, char **)
{
foo("The %s is %d pixels wide and %d pixels high.", "box", 300, 200);
return 0;
}

程序的调试构建在打印消息“盒子宽 300 像素,高 200 像素”后正常终止。

发布版本因段错误而崩溃。

我对这种行为的解释 - 但我可能错了,如果是这样请纠正我 - 我错误地指定了一个函数参数,而不是 va_start,这里唯一可接受的形式是 va_start(args, requiredArgument) 而不是我希望的 va_start(args, format)。换句话说,我滥用 va_start 的方式使整个程序的流程变得不可预测,因此这里的段错误不过是正常的。

如果我的假设是正确的,我现在有两个问题:

  • 为什么还需要在 va_start 中指定最后一个正式声明的函数参数,如果选择其他任何参数显然是非法的?

  • 为什么挑剔的 VC++ 编译器不对如此容易检测和潜在严重的陷阱发出警告?

最佳答案

Why is it even required to specify the last formally declared function parameter in va_start, if choosing anything else is apparently illegal?

因为该宏需要知道最后一个参数的地址

Why does the picky VC++ compiler not raise a warning for such an easy to detect and potentially critical pitfall?

因为它还不够“智能”。或者它的创建者决定不包含此警告。或许它可以,但默认情况下它是关闭的,您可以使用一些编译器标志将其打开。

关于C++ 为什么 va_start 期望最后一个非可变函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14674028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com