首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >以此作为参数使用va_start宏安全吗?

以此作为参数使用va_start宏安全吗?
EN

Stack Overflow用户
提问于 2019-04-17 21:31:10
回答 1查看 1K关注 0票数 18

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

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

代码语言:javascript
复制
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一样。我不介意。

EN

回答 1

Stack Overflow用户

发布于 2019-04-17 21:39:04

我认为这应该是可以的,尽管我怀疑你会从C++标准中找到这样说的具体引用。

其基本原理是:必须将最后一个参数传递给函数的va_start()。不带显式参数的成员函数只有一个参数(this),因此它必须是它的最后一个参数。

如果你曾经在一个不能工作的平台上编译过(这似乎不太可能,但是你已经在一个有点非典型的平台上编译了),添加一个单元测试来提醒你是很容易的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55728743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档