首页 > 解决方案 > 为什么不允许在全局(文件)范围内初始化结构成员,但在函数内部可以这样做?

问题描述

我在 ac 文件的全局范围内声明了一个这样的结构:

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: "error: expected '=', ',', ';', 'asm' or '<strong>attribute' before '.' 令牌”
g++:“错误:'s4' 没有命名类型”

有人可以解释为什么在全局范围内为 s4.i 赋值是非法的吗?

标签: c

解决方案


您只能在函数之外进行常量表达式初始化。

所有代码都必须在函数内部。

s4.i = 6;不是初始化,它是必须在函数体内的赋值


推荐阅读