初始化结构varargs

问题描述 投票:0回答:2

我想用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);
}
c struct variadic-functions
2个回答
2
投票

va_arg(args, Coordinate) 应该是 va_arg(args, Coordinate *).

您可以将整个结构用 复数字面:

*va_arg(args, Coordinate *) = (Coordinate) { 10, 5 };

void main() 应该是 int main(void).


1
投票

完全可以合法地使用结构类型的 va_arg 宏。要求是

参数类型应为 类型 指定的名称,这样,指向具有指定类型的对象的指针的类型可以通过简单的后缀来获得。*类型.

调用 va_arg 属于这种类型。 类型的指针。你将一个类型为 Coordinatedec属于 Coordinate*. 修正这一点,并相应地调整其余的代码,你应该能够使它工作。

另外。

void main() 是不正确的。使用 int main(void).

您的问题中的代码至少缺少三个必要的 #include 指令。

您的代码定义了 AddValues 却叫 AddValuesOriginal.

如果你告诉我们 "但这并不工作。",你需要告诉我们确切的 如何 它不工作。在你的问题中包含任何错误信息,格式为代码。

© www.soinside.com 2019 - 2024. All rights reserved.