假设我使用的是具有属性的对象.比方说:形状、 colored颜色 和大小.并将每个属性作为有效选项列表.例如,形状:圆形或正方形, colored颜色 :橙色、黄色、白色或红色,大小:大、中或小.

对于每个属性,我使用C struct 来处理它们.有关简单的示例,请参阅下面的代码:

#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个字符串,因为它们是唯一可用的(不使用枚举类型,因为这些字符串在输入文本文件中使用).Everything is known at compile time.

此代码运行良好.但我想知道是否有可能将每个选项的两个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"}};

推荐答案

您可以使用compound literal:

  const valid_options_t my_size_opts = {.name="size", .nb=3,
       .list = (const char *[]) { "large", "medium", "small" }
    };

复合文字的形式是(Type) { Initializer-List… }.这不是强制转换,尽管它有类似的形式,即圆括号中的类型.它创建一个指定类型的对象,并使用给定的初始值设定项进行初始化.

函数外部的复合文字具有静态存储持续时间.在函数内部,它具有自动存储持续时间.其他选项预计将在下一次修订的C标准中可用.

C++相关问答推荐

在x86汇编中,为什么当分子来自RDRAND时DIV会引发异常?

我可以动态分配具有空类型函数的矩阵吗?

intellisense不工作,甚至已经下载了c/c++扩展

C指针地址和转换

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

如何创建由符号组成的垂直结果图形?

为什么GCC C23中的关键字FALSE不是整数常量表达式?

Make Node函数.S有什么问题吗?

VS代码';S C/C++扩展称C23真关键字和假关键字未定义

错误Cygwin_Except::Open_stackdupfile:正在转储堆栈跟踪是什么?

如何使解释器存储变量

==284==错误:AddressSaniizer:堆栈缓冲区下溢

-Wnonnull-Compare警告不是具有误导性吗?

在吉陀罗中,_2_1_和CONCAT11是什么意思?

从整型转换为浮点型可能会改变其值.

c如何传递对 struct 数组的引用,而不是设置 struct 的副本

在分配内存后使用指针是未定义的行为吗?

使用 strtok 多次分割一个字符串会导致意外行为

C 程序不显示任何输出,但它接受 CS50 Lab1 的输入问题

可以从指针数组中的值初始化指针吗?