gpt4 book ai didi

c++ - 将此作为参数使用 va_start 宏是否安全?

转载 作者:IT老高 更新时间:2023-10-28 22:02:47 27 4
gpt4 key购买 nike

我必须在嵌入式应用程序中使用 IAR 编译器(它没有命名空间、异常、多重/虚拟继承、模板有点限制并且仅支持 C++03)。我不能使用参数包,所以我尝试使用可变参数创建成员函数。我知道可变参数通常是不安全的。但是在 va_start 宏中使用 this 指针是否安全?

如果我使用普通的可变参数函数,则在 ... 之前需要一个虚拟参数才能访问剩余的参数。我知道可变参数宏在 ... 之前不需要参数,但我不想使用它。如果我使用成员函数,它在 ... 之前隐藏了 this 参数,所以我尝试了它。:

struct VariadicTestBase{
virtual void DO(...)=0;
};

struct VariadicTest: public VariadicTestBase{
virtual void DO(...){
va_list args;
va_start(args, this);
vprintf("%d%d%d\n",args);
va_end(args);
}
};

//Now I can do
VariadicTestBase *tst = new VariadicTest;
tst->DO(1,2,3);

tst->DO(1,2,3); 按预期打印 123。但我不确定这是否不仅仅是一些随机/未定义的行为。我知道 tst->DO(1,2); 会像普通的 prinf 一样崩溃。我不介意。

最佳答案

标准中没有指定该行为,因此该构造仅调用正式的未定义行为。这意味着它可以在您的实现中正常工作,并在不同的实现中导致编译错误或意外结果。

非静态方法必须传递隐藏的 this 指针这一事实并不能保证 va_start 可以使用它。它可能是这样工作的,因为在早期,C++ 编译器只是将 C++ 源代码转换为 C 源代码的预处理器,而隐藏的 this 参数由预处理器添加以供 C 使用编译器。并且可能出于兼容性 的原因对其进行了维护。但我会尽量避免在关键任务代码中出现这种情况......

关于c++ - 将此作为参数使用 va_start 宏是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55728743/

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