C90:如何在没有 C99 扩展的情况下在 C 中全局初始化此结构

Posted

技术标签:

【中文标题】C90:如何在没有 C99 扩展的情况下在 C 中全局初始化此结构【英文标题】:C90: How do I globally initialize this struct in C without C99 extensions 【发布时间】:2011-10-01 06:49:40 【问题描述】:

我想知道用 C90 初始化这个结构的最佳方法是什么,同时又要保持整洁。

在我的头文件中,称之为 test.h,我定义了以下结构:

 struct s_test_cfg
      char *a[3];
      char *b[3];
      char *c[3];
 

然后我将它声明为外部结构,以便我可以在 .c 文件中全局初始化它:

 extern struct s_test_cfg test_cfg;

现在在我的 .c 文件中,我希望能够在全局范围内声明这样的内容(显然我要编写的内容在 C90 中不受支持):

 struct s_test_cfg test_cfg =
  .a = "a", "b", "c",\
   .b = "d", "e", "f",\
   .c = "g", "h", "i" ;

这显然使您想要做的事情变得非常整洁和透明。如何在我的 C 文件中初始化与此语法一样干净的全局结构?谢谢。

【问题讨论】:

GCC 但我们希望将其保留为 C90,因为项目中的所有其他内容都是为 C90 兼容性而编写的。 在我们的项目中,我们甚至转向了仅 gcc 扩展(有些仅在 gcc >= 4.5 中),因为使用另一个编译器的可能性非常低。 注意:在初始化中不需要 `\` 继续符(除非它实际上是跨多行的宏的一部分)。 【参考方案1】:
struct s_test_cfg test_cfg = 
     "a", "b", "c" ,  /* .a */
     "d", "e", "f" ,  /* .b */
     "g", "h", "i" ,  /* .c */
;

可能是最简洁的选择(没有给自己一个 C99 编译器;GCC 和 Intel C 都支持 C99)。

【讨论】:

我本可以发誓我之前多次尝试过这个并且得到了关于标量初始值设定项周围大括号的编译器错误,但无论出于何种原因,它现在似乎都可以工作,去看看。感谢您确认这会起作用。

以上是关于C90:如何在没有 C99 扩展的情况下在 C 中全局初始化此结构的主要内容,如果未能解决你的问题,请参考以下文章

0x03-数据和C

C99的新特性

C99的新特性

不同 C/C++ 语言版本 + GNU 扩展的 ABI 兼容性

如何在没有扩展内联 asm 的情况下在 gcc 内联汇编中声明和初始化局部变量?

C99标准新特性的说明