使用可变参数函数将整数和/或整数数组放入单个 int 数组中

Integers and/or array of integers into a single int array using variadic function

本文关键字:数组 整数 int 单个 变参 参数 函数      更新时间:2023-10-16

我正在尝试编写一个函数,该函数具有可变数量的整数/整数数组参数,将所有元素连接成一个一维数组。我正在努力应对两种情况之一,其中current_item结果是一个数组而不仅仅是一个整数。如何访问此数组的各个元素并将它们分配给 pOutList?

typedef unsigned short      WORD;
int PinListJoin(WORD * pOutList, ...) {
int index=0;
boolean isArray = false;
va_list next_item;
va_start(next_item, pOutList);
WORD current_item = va_arg(next_item, WORD);
int current_item_size = sizeof(current_item) / sizeof(WORD);
if (current_item_size > 1) {
isArray = true;
for (int pinidx = 0; pinidx < current_item_size; pinidx++) {
pOutList[index] = current_item;
index++;
}
}
else {
isArray = false;
pOutList[index] = current_item;
index++;
}
va_end(next_item);
return(current_item_size);
}
boolean isArray = false;

C++中没有boolean数据类型。

此外,函数中从未使用isArrayindex变量的值。

typedef unsigned short      WORD;
WORD current_item = va_arg(next_item, WORD);

这是行不通的。提倡可变参数。unsigned short提升为int(通常;在某些奇特的系统上,它可能unsigned int(。将非升级类型与va_arg一起使用将导致未定义的行为。您可以使用这样的技巧来获取任何系统的正确类型:

using promoted_word = decltype(+WORD(0));
WORD current_item = WORD(va_arg(next_item, promoted_word));
WORD current_item = va_arg(next_item, WORD);
int current_item_size = sizeof(current_item) / sizeof(WORD);

WORD的大小除以WORD的大小始终为 1。这样做是没有意义的。

我正在努力解决两种情况之一,其中current_item结果是一个数组而不仅仅是一个整数。如何访问此数组的各个元素并将它们分配给 pOutList?

函数参数不能是数组。但它可以是指向数组元素的指针,我认为这就是你的意思。如果是这种情况,那么你可以像这样从 varargs 中获取指针:

WORD* current_item = va_arg(next_item, WORD*);

然后,您可以将元素从一个数组复制到另一个数组,就像使用指向元素的任何指针一样。

不过仍然存在两个问题:1.无法根据该指针找出数组的大小,2.没有办法找出传递了什么类型的参数(即它是a(指针指向a(n数组还是整数(。您可以查看printf的界面,了解如何解决该问题。它在那里使用指定这些类型的格式字符串来解决。数组的长度通过使用哨兵值(空终止符(来解决。另一种方法是将长度作为单独的参数传递。


更一般地说:我建议您不要在C++中使用 C 样式的 varargs。搬起石头砸自己的脚太容易了。可变参数模板是实现类似事情的更安全、更强大的方式。

也就是说,我不太明白你想做什么,所以我无法确认使用任何形式的变数是否有意义。