c - 为什么不允许在全局(文件)范围内初始化结构成员,但在函数内部可以这样做?
问题描述
我在 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 赋值是非法的吗?
解决方案
您只能在函数之外进行常量表达式初始化。
所有代码都必须在函数内部。
s4.i = 6;
不是初始化,它是必须在函数体内的赋值
推荐阅读
- linux - 通过特定网络接口路由 HTTP
- python - 如何让方法在类外查找类内部以进行范围界定
- python - 如何对时间实例进行分组、查找其持续时间并根据特定条件求和(在 R 或 Python 中)
- python - 如何从 python 中的网页获取 localStorage 属性?
- python - TextMate 2中的Python文本折叠不折叠列表/元组/字典
- database - 为什么在数据库中需要编码
- c# - ASP.Net Core MVC 在按下特定按钮时禁用验证
- google-cloud-platform - 为不同的时间间隔(小时和天)配置 cron 计划
- kotlin - Kotlin - 有没有办法将属性值传递给另一个具有同名属性的对象?
- android-studio - 从 Flutter 上的调试构建中排除资产