我必须在嵌入式应用程序中使用IAR compiller (它没有名称空间、异常、多重/虚拟继承、模板有限,只支持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一样。我不介意。
发布于 2019-04-17 21:39:04
我认为这应该是可以的,尽管我怀疑你会从C++标准中找到这样说的具体引用。
其基本原理是:必须将最后一个参数传递给函数的va_start()
。不带显式参数的成员函数只有一个参数(this
),因此它必须是它的最后一个参数。
如果你曾经在一个不能工作的平台上编译过(这似乎不太可能,但是你已经在一个有点非典型的平台上编译了),添加一个单元测试来提醒你是很容易的。
https://stackoverflow.com/questions/55728743
复制相似问题