【发布时间】:2021-09-04 17:09:10
【问题描述】:
我有以下类型定义:
typedef struct {
int (*function)(int argc, char *argv[]);
char *name;
} command_t;
成员function是一个函数指针,成员name是一个字符串,它将存储函数的名称。
为了初始化command_t 类型的变量,我编写了以下宏:
#define COMMAND(x) (command_t){.function = x, .name = #x}
这是我目前初始化command_t数组的方式:
int ls(int argc, char *argv[]);
int echo(int argc, char *argv[]);
int cat(int argc, char *argv[]);
int mkdir(int argc, char *argv[]);
command_t cmd_list[] = {COMMAND(ls), COMMAND(echo), COMMAND(cat), COMMAND(mkdir)};
我希望能够像这样初始化command_t 的数组:
command_t cmd_list[] = COMMAND(ls, echo, cat, mkdir);
或
command_t cmd_list[] = {COMMAND(ls, echo, cat, mkdir)};
我知道COMMAND 必须是可变参数宏才能这样做,但我不知道如何编写。
【问题讨论】:
-
我不认为它可以用可变参数宏来完成。预处理器无法解构 VA_ARGS 并处理每个 arg。它只能对其体内的 VA_ARGS 进行简单的扩展。恕我直言,X 宏在这里更合适。
-
"我希望能够像这样初始化一个 command_t 数组" 为什么?它并没有提高可读性,它只是让你的代码看起来更神秘。如果有的话,你应该为整个初始化列表创建一个宏。
标签: arrays c struct initialization variadic-macros