从 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
}
我有这个示例代码,我在其中传递了 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
}