C 中是否有语法可以直接初始化作为常量文字的 const 数组的结构成员?

问题描述 投票:0回答:1

假设,我使用具有属性的对象。比方说:形状、颜色和大小。每个属性都是有效选项的列表。例如,形状:圆形或方形,颜色:橙色或黄色或白色或红色,尺寸:大或中或小。

对于每个属性,我使用 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"}};
arrays c string struct
1个回答
1
投票

您可以使用复合文字

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

复合文字的形式是

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

函数外部的复合文字具有静态存储持续时间。在函数内部,它具有自动存储期限。预计 C 标准的下一版本中将提供更多选项。

© www.soinside.com 2019 - 2024. All rights reserved.