我有一个嵌套的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) { ... }