为何在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
相关产品推荐
相关产品推荐

