C:用指针静态初始化复合结构

C: static initialisation of compound struct with pointers

我有一个嵌套的 C (gcc-11) 结构,它包含一个指向另一个结构的指针数组。我想创建一个这种类型的静态变量并同时初始化它。所有这些都在一个头文件中。原因是它代表了一些属于该头文件的默认值。我不想调用初始化函数来设置它。

以下编译成功:

typedef struct s1_s {
        int a;
        int b;
} s1_t;

typedef struct s2_s {
        int c;
        s1_t *s1s; // but I need this to be **s1s really!
} s2_t;

s2_t *def = &(s2_t){
        .c = 10,
        .s1s = &(s1_t){  
                .a = 100,
                .b = 200 
        } 
};
int main(void){ return 1; }

但我想要一个指针数组:s1_t **s1s,准确地说。这不编译:

typedef struct s1_s {
        int a;
        int b;
} s1_t;

typedef struct s2_s {
        int c;
        s1_t **s1s; // "array" of pointers
} s2_t;

s2_t *def = &(s2_t){
        .c = 10,
        // I want an "array" of 1 *(s1_t*) element
        .s1s = &(s1_t *){{  
                .a = 100,
                .b = 200 
        }} 
};
int main(void){ return 1; }

这些是第一个错误:

warning: braces around scalar initializer
   15 |         .s1s = &(s1_t *){{
error: field name not in record or union initializer
   16 |                 .a = 100,
...

只需这样做:

s2_t *def = &(s2_t){
        .c = 10,
        // I want an "array" of 1 *(s1_t*) element
        .s1s = (s1_t*[]){&(s1_t){  
                .a = 100,
                .b = 200 
        }} 
};
  • (s1_t*[]) 表示复合文字的类型是“指向 s1_t 的指针数组”。编译器会自动推断其大小
  • 数组的每个元素必须是一个指针,因此定义为&(s1_t) { ... }