从 C 中具有结构参数的可变参数函数获取可变参数

Get var args from a varadic function with struct parameters in C

我有这个示例代码,我在其中传递了 count 中的参数数量,后跟不同类型的参数。

struct my_struct;

my_func(int count, char* input_1, my_struct input_2, my_struct input_3);
my_func(int count, char* input_1, my_struct input_2);

如何检索参数?我知道使用 va_arg 给出了主要数据类型的参数,但结构不接受。

将非 POD 类型作为可变参数传递是不可移植的。我相信它会在 MSVC 中工作(带有警告),而 clang 将完全拒绝编译它。在其他情况下,它可能会编译(希望有警告),但不会以您预期的方式执行。

您可以改为在函数中将可变参数作为指针传递:

// Get copy
my_struct input = *va_arg( vl, my_struct* ) ;

// Get reference
my_struct* input = va_arg( vl, my_struct* ) ;

调用可能如下所示:

my_struct a ;
my_struct b ;
...
my_func( 2, str, &a, &b ) ;

不是按值传递结构,而是传递指向它们的指针。

示例:

#include <stdarg.h>
#include <stdio.h>
#include <string.h>

typedef struct {
    char x;
} my_struct;

void my_func(char* input, ...) {
    va_list ap;
    va_start(ap, input);

    for(; *input; ++input) {
        my_struct* ptr = va_arg(ap, my_struct*); // get the pointer
        ptr->x = *input;                         // use it
    }

    va_end(ap);
}

int main() {
    my_struct a;
    my_struct b;

    my_func("a", &a);            // my_struct* 
    
    printf("%c\n", a.x);         // prints a

    my_func("xy", &a, &b);       // two my_struct*
    
    printf("%c %c\n", a.x, b.x); // prints x y
}