c - 为什么不允许在全局(文件)范围内初始化结构体成员,但可以在函数内部进行初始化?

标签 c

我在 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/

相关文章:

c++ - 哪些平台具有不兼容的 C 和 C++ ABI?

c - 为什么C程序中调用线程数比执行线程数多?

c - 是否可以为scanf指定一个由多个 `^`个字符组成的字符串?

c - OSX 10.11.6 lldb 说断点 1 : no locations (pending)

c - 从一个方法返回多个 char *

在 C 中创建线程

C 在内存中写入位

c++ - IF 和比较顺序

c - X.509v3 ASN.1至C数据结构

c - 在C中使用插入排序对字符串进行排序 - 段错误