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

为何在C语言中使用结构体字面量进行==比较会编译报错?

问题分析:结构体比较导致的编译错误

示例代码

void f(void)
{
    typedef struct Position {
        int x;
        int y;
    } Position;

    Position p1 = { 10UL, 10UL };
    if (p1 == (Position){10UL, 10UL}) {}
}

编译错误信息

t.c: In function ‘f’:
t.c:9:12: error: invalid operands to binary == (have ‘Position’ {aka ‘struct Position’} and ‘Position’ {aka ‘struct Position’})
    9 |     if (p1 == (Position){10UL, 10UL}) {}
      |            ^~

问题原因与解决方法

核心问题不是复合字面量的使用违规,而是C语言本身不支持直接用==运算符比较结构体类型的对象——不管是普通命名结构体变量,还是复合字面量生成的结构体实例,都不能直接用相等运算符做比较。

要判断两个结构体是否相等,必须手动逐个比较它们的成员:

// 直接比较复合字面量的成员
if (p1.x == ((Position){10UL, 10UL}).x && p1.y == ((Position){10UL, 10UL}).y) {}

或者先把复合字面量赋值给临时变量,再比较成员:

// 先赋值给临时变量再比较
Position p2 = (Position){10UL, 10UL};
if (p1.x == p2.x && p1.y == p2.y) {}

补充说明:你使用的复合字面量本身是符合C标准的,完全可以在表达式中用来生成结构体实例,但这和结构体能否直接比较是两个独立的语法规则——C语言没有为结构体类型重载==运算符,所有结构体比较都需要手动实现成员级别的校验。

内容的提问来源于stack exchange,提问作者my_question

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:03:37