如何在c中的结构中初始化匿名联合

How to initialise an anonymous union within a struct in c

我想初始化 mainstr 的所有三个数组,谁能帮我初始化结构中的这个匿名联合?第 0 个索引应使用整数数组初始化,第 1 和第 2 个索引应使用 char 指针初始化。

typedef struct
{
   int testy;
   union
   {
      int a[3];
      char* b[3];
   }
   bool testz;
} testStr;


typedef struct
{
    testStr x[3];
} mainStr;

像这样,

mainStr test = {
                  {20, {{10, 20, 30}}, FALSE},
                  {10, {{"test1", "test2", NULL}}, TRUE},
                  {30, {{"test3", "test4", NULL}}, FALSE},
              }

使用designators:

mainStr test = {{
                {20, {{10, 20, 30}}, false},
                {10, {.b={"test1", "test2", NULL}}, true},
                {30, {.b={"test3", "test4", NULL}}, false},
               }};

Demo

有点工作,但可以做到。

#include <stdbool.h>
int foo() {
  typedef struct {
    int testy;
    union {
      int a[3];
      char *b[3];
    };
    bool testz;
  } testStr;

  typedef struct {
    testStr x[3];
  } mainStr;

  testStr test1 = {20, { {10, 20, 30}}, false};
  (void) test1;

  mainStr test = { //
      { //
          {20, { {10, 20, 30}}, false}, //
          {10, { .b={"test1", "test2", NULL}}, true}, //
          {30, { .b={"test3", "test4", NULL}}, false} //
          }//
      };
  (void) test;
}

一些问题:

  • union { ... }; 必须以分号结尾。
  • 使用标准 bool 而不是一些自制版本。
  • mainStr 意味着需要一对额外的初始化器,一个用于结构,一个用于数组成员 x.

解决了这些问题后,您可以使用指定的初始化程序来告诉编译器您正在初始化哪个联合成员:

#include <stdbool.h>

typedef struct {
  int testy;
  union {
    int a[3];
    char* b[3];
  };
  bool testz;
} testStr;

typedef struct {
  testStr x[3];
} mainStr;

int main (void) {
  mainStr test = 
  {
    {
      {20, .a = {10, 20, 30}, false},
      {10, .b = {"test1", "test2", 0}, true},
      {30, .b = {"test3", "test4", 0}, false},
    }
  };
}

尽管如此,为 所有 struct/union 成员使用指定的初始值设定项可能是个好主意,以获得自我记录的代码。