我想在varargs中填充整个结构。我知道该结构的所有单个元素都可以用int16_t *x = va_arg(args, int16_t*);
填充,但是我正在寻找一种更有效的方法,以便可以使用memset
。我试图对整个结构使用相同的代码,如下所示。但这是行不通的。因此,有一种方法可以仅使用一个va_args
参数来初始化整个结构,而不是对所有单个元素使用varargs。
typedef struct {
int16_t x;
int16_t y;
} Coordinate;
void AddValues(int count, ...) {
va_list args;
va_start(args, count);
Coordinate *dec = va_arg(args, Coordinate*);
*dec.x = 10;
*dec.y = 5;
va_end(args);
}
int main() {
Coordinate cor;
AddValues(2, &cor);
printf("x: %d and y: %d\n", cor.x, cor.y);
}
答案 0 :(得分:2)
va_arg(args, Coordinate)
应该是va_arg(args, Coordinate *)
。
您可以用复合文字分配整个结构:
*va_arg(args, Coordinate *) = (Coordinate) { 10, 5 };
void main()
应该是int main(void)
。
答案 1 :(得分:1)
在va_arg
宏中使用结构类型是完全合法的。要求是
参数类型应为 type 名称,该名称应指定为 可以获得具有指定类型的对象的指针 只需将
*
后缀为 type 。
调用va_arg
的结果就是该类型,不是指向该类型的指针。您正在将Coordinate
类型的值dec
分配给Coordinate*
。修复该错误,并相应地调整其余代码,您应该能够使其正常工作。
也:
void main()
不正确。使用int main(void)
。
问题中的代码至少缺少三个必需的#include
指令。
您的代码定义了AddValues
,但调用了AddValuesOriginal
。
如果您告诉我们“但这不起作用。”,则需要向我们确切说明如何。在您的问题中包含所有错误消息,格式为代码。