我在 c 文件的全局范围内有一个这样声明的结构:
typedef struct S_t {
int i;
char c;
} S_t;
S_t s1;
编译器不允许我在全局范围内初始化每个成员,但可以在函数内进行初始化,例如。主要():
S_t s1 = {5, 'c'}; // This is OK!
S_t s2 = {.i=5, .c='5'}; // OK, designated initialization
S_t s3 = {.c='c'}; // OK, partial designated initialization
S_t s4;
// s4 = {5, 'c'}; //This is an error. Why?
// s4.i = 5; //This is also an error.
int main(void) {
s4.i = 6; //This is fine..
return 0;
}
我尝试使用 gcc(C11、C18)以及 g++。
但我总是收到错误:
gcc:“错误:‘.’标记之前应有‘=’、‘,’、‘;’、‘asm’或‘属性’”
g++:“错误:‘s4’没有命名类型”
有人可以解释一下为什么在全局范围内给 s4.i 赋值是非法的吗?
最佳答案
您只能在函数外部进行常量表达式初始化。
所有代码都必须位于函数内部。
s4.i = 6;
不是初始化,而是必须位于函数体内的赋值
关于c - 为什么不允许在全局(文件)范围内初始化结构体成员,但可以在函数内部进行初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63781738/