函数参数中的省略号是否使用与普通参数相同的调用布局

淡紫色

我想调用一个extern "C"函数,例如f1(int a, float f, double d, void* ptr)使用带有实际参数的前向声明,但是在实际实现中,我想使用argsva_list和它的朋友pop让我们想象一下我有一个有效的用例,是否可以使用?

main.cpp

extern "C" void f(int anchor, int a, float f, double d, void* ptr, char c);

int main(int, char*)
{
   f(0, 42, 1.08f, 3.14, reinterpret_cast<void*>(0xcafebabe), 'c');
   return 0;
}

impl.cpp

#include <cstdarg>
#include <iostream>
#include <iomanip>

using namespace std;

void f(int anchor, ...)
{
  va_list args;
  va_start(args, anchor);

  int a = va_arg(args, int);
  float f = va_arg(args, float);
  double d = va_arg(args, double);
  void* ptr = va_arg(args, void*);
  char c = va_arg(args, char);

  cout << a << ' '
       << f << ' '
       << d << ' '
       << hex << (std::ptrdiff_t)ptr << ' '
       << (int)c << endl;

  va_end(args);
}

该代码至少会在MSVC 2015上运行并打印正确的值,现在的问题是:它是否可以保证工作,如果不能,那么,它是否仍可以在最重要的平台和编译器上工作?

萨胡

从理论上讲,您的代码会受到不确定的行为的影响。实际上,当我尝试使用g ++构建后运行程序时,我得到了

Illegal instruction (core dumped)

原因是当函数具有可变参数参数时,它只能处理ints,doubles,指针。它不能处理floats和chars。

声明是否指定为:

extern "C" void f(int anchor, ...);

float将被提升到doublechar将被提升到一个int

在实现方面,您需要使用:

 float f = (float)va_arg(args, double);

 char c = (char)va_arg(args, int);

有关该主题的更多信息,请参见C函数调用中的默认参数提升

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

嵌套函数调用和省略号的名称相同的参数

来自分类Dev

使函数对help()函数中的参数使用省略号

来自分类Dev

是否应该在可变参数函数中的省略号(...)之前直接声明count参数?

来自分类Dev

在定义中使用省略号时,如何在R函数调用中捕获错误或未定义的参数

来自分类Dev

R:函数如何使用省略号(...)接受变量参数而不将其复制到内存中?

来自分类Dev

在自定义函数中包含额外的(省略号/点点)参数

来自分类Dev

省略号出现在模板函数的参数声明中

来自分类Dev

为什么我要把省略号放在函数的参数中?

来自分类Dev

如何使用自己的自定义函数(而不是vprintf等)处理可变参数(通过省略号)?

来自分类Dev

如何使用自己的自定义函数(而不是vprintf等)处理可变参数(通过省略号)?

来自分类Dev

使用嵌套函数时,为什么 R 省略号 (...) 匹配更多参数?

来自分类Dev

如何让R识别省略号中的参数向量?

来自分类Dev

如何让R识别省略号中的参数向量?

来自分类Dev

使用省略号将参数传递给函数,并为某些参数(如果不存在)设置默认值

来自分类Dev

使用省略号将参数传递给函数,并为某些参数(如果不存在)设置默认值

来自分类Dev

在C中用省略号传递参数

来自分类Dev

当不带参数调用时,为什么省略号优于可变参数模板?

来自分类Dev

当不带参数调用时,为什么省略号优于可变参数模板?

来自分类Dev

...(省略号)作为函数原型中的一个且唯一的函数参数在C ++中意味着什么?

来自分类Dev

省略号作为可变参数模板之外的构造函数参数

来自分类Dev

如何检查R中是否通过“ ...”(省略号)传递了任何参数?缺少(...)有效吗?

来自分类Dev

如何使用省略号传递参数并在R中的另一个环境中求值

来自分类Dev

如何将省略号运算符得到的参数传递给其他函数?

来自分类Dev

以参照透明的方式从函数的省略号参数中提取符号

来自分类Dev

如何将省略号运算符得到的参数传递给其他函数?

来自分类Dev

方案:如何检查是否已使用相同的参数调用函数

来自分类Dev

通过嵌套宏中的省略号捕获可变数量的参数;缺少模式变量错误

来自分类Dev

如何检测C ++中通过省略号传递的参数的大小?

来自分类Dev

通过嵌套宏中的省略号捕获可变数量的参数;缺少模式变量错误

Related 相关文章

  1. 1

    嵌套函数调用和省略号的名称相同的参数

  2. 2

    使函数对help()函数中的参数使用省略号

  3. 3

    是否应该在可变参数函数中的省略号(...)之前直接声明count参数?

  4. 4

    在定义中使用省略号时,如何在R函数调用中捕获错误或未定义的参数

  5. 5

    R:函数如何使用省略号(...)接受变量参数而不将其复制到内存中?

  6. 6

    在自定义函数中包含额外的(省略号/点点)参数

  7. 7

    省略号出现在模板函数的参数声明中

  8. 8

    为什么我要把省略号放在函数的参数中?

  9. 9

    如何使用自己的自定义函数(而不是vprintf等)处理可变参数(通过省略号)?

  10. 10

    如何使用自己的自定义函数(而不是vprintf等)处理可变参数(通过省略号)?

  11. 11

    使用嵌套函数时,为什么 R 省略号 (...) 匹配更多参数?

  12. 12

    如何让R识别省略号中的参数向量?

  13. 13

    如何让R识别省略号中的参数向量?

  14. 14

    使用省略号将参数传递给函数,并为某些参数(如果不存在)设置默认值

  15. 15

    使用省略号将参数传递给函数,并为某些参数(如果不存在)设置默认值

  16. 16

    在C中用省略号传递参数

  17. 17

    当不带参数调用时,为什么省略号优于可变参数模板?

  18. 18

    当不带参数调用时,为什么省略号优于可变参数模板?

  19. 19

    ...(省略号)作为函数原型中的一个且唯一的函数参数在C ++中意味着什么?

  20. 20

    省略号作为可变参数模板之外的构造函数参数

  21. 21

    如何检查R中是否通过“ ...”(省略号)传递了任何参数?缺少(...)有效吗?

  22. 22

    如何使用省略号传递参数并在R中的另一个环境中求值

  23. 23

    如何将省略号运算符得到的参数传递给其他函数?

  24. 24

    以参照透明的方式从函数的省略号参数中提取符号

  25. 25

    如何将省略号运算符得到的参数传递给其他函数?

  26. 26

    方案:如何检查是否已使用相同的参数调用函数

  27. 27

    通过嵌套宏中的省略号捕获可变数量的参数;缺少模式变量错误

  28. 28

    如何检测C ++中通过省略号传递的参数的大小?

  29. 29

    通过嵌套宏中的省略号捕获可变数量的参数;缺少模式变量错误

热门标签

归档