C语言报错:expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token原因解析
C语言全局结构体赋值报错原因解析
问题场景
以下代码编译时会触发错误:error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
#include <stdio.h> struct point { int x; int y; }; struct rectangle { struct point upper_left; struct point lower_right; }; double calcul_area(struct rectangle a) { double width = a.lower_right.x - a.upper_left.x; double height = a.upper_left.y - a.lower_right.y; return width * height; } // 以下代码放在main外报错,放在main内则正常运行 struct rectangle r; r.upper_left.x = 3; r.upper_left.y = 9; r.lower_right.x = 12; r.lower_right.y = 2; int main() { printf("the size of rectangle is %f", calcul_area(r)); }
报错原因
C语言对全局作用域的代码有明确限制:
- 全局作用域仅允许存在变量声明/定义和初始化语句,不能直接编写执行性代码。
struct rectangle r;是全局变量的定义,属于合法的全局作用域代码。- 但
r.upper_left.x = 3;这类通过.访问结构体成员并赋值的语句,属于执行语句,必须放在函数(比如main)内部的代码块中执行,不能直接出现在全局作用域。
全局作用域的正确初始化方式
如果想在全局作用域完成结构体的初始化,可以使用初始化器语法:
struct rectangle r = {{3, 9}, {12, 2}};
这样就能在全局作用域合法完成结构体成员的赋值,不会触发编译错误。
内容的提问来源于stack exchange,提问作者user21214872
相关产品推荐
相关产品推荐

