You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:57:15