假设,我使用具有属性的对象。比方说:形状、颜色和大小。每个属性都是有效选项的列表。例如,形状:圆形或方形,颜色:橙色或黄色或白色或红色,尺寸:大或中或小。
对于每个属性,我使用 C 结构来处理它们。请参阅下面的代码作为简单示例:
#include <stdio.h>
typedef struct {
const char* name;
const int nb;
const char* const* list;
} valid_options_t;
void print_options (const valid_options_t* option) {
printf("Option Name : %s\n",option->name);
for (int i=0; i < option->nb; i++) printf("\t%s\n",option->list[i]);
printf("---------\n");
}
int main() {
const char* const my_size_optslist[] = {"large", "medium", "small"};
const valid_options_t my_size_opts = {.name="size", .nb=3, .list=my_size_optslist};
const char* const my_color_optslist[] = {"orange", "yellow", "white", "red"};
const valid_options_t my_color_opts = {.name="color", .nb=4, .list=my_color_optslist};
const char* const my_form_optslist[] = {"circle", "square"};
const valid_options_t my_form_opts = {.name="circle", .nb=2, .list=my_form_optslist};
print_options (&my_size_opts);
print_options (&my_color_opts);
print_options (&my_form_opts);
}
属性名称及其选项是constant字符串,因为它们是唯一可用的(不使用枚举类型,因为这些字符串在输入文本文件中使用)。 一切在编译时就已知。
这段代码运行良好。但我想知道是否可以将每个选项的两行 init 合并到一行中,以避免声明仅在此处使用的
my_xxx_optslist
变量。
例如可以更换吗
const char* const my_size_optslist[] = {"large", "medium", "small"};
const valid_options_t my_size_opts = {.name="size", .nb=3, .list=my_size_optslist};
类似的事情:
const valid_options_t my_size_opts = {.name="size", .nb=3, .list={"large", "medium", "small"}};
您可以使用复合文字:
const valid_options_t my_size_opts = {.name="size", .nb=3, .list=
(const char *[]) { "large", "medium", "small" }
};
复合文字的形式是
(Type) { Initializer-List… }
。尽管它具有类似的形式(括号内的类型),但这不是强制转换。它创建一个指定类型的对象,并使用给定的初始值设定项进行初始化。
函数外部的复合文字具有静态存储持续时间。在函数内部,它具有自动存储期限。预计 C 标准的下一版本中将提供更多选项。