这是我的代码:
\nvoid f(void)\n{\n typedef struct Position {\n int x;\n int y;\n } Position;\n\n Position p1 = { 10UL, 10UL };\n if (p1 == (Position){10UL, 10UL}) {}\n}\nRun Code Online (Sandbox Code Playgroud)\ngcc 给我这个编译错误:
\nt.c: In function \xe2\x80\x98f\xe2\x80\x99:\nt.c:9:12: error: invalid operands to binary == (have \xe2\x80\x98Position\xe2\x80\x99 {aka \xe2\x80\x98struct Position\xe2\x80\x99} and \xe2\x80\x98Position\xe2\x80\x99 {aka \xe2\x80\x98struct Position\xe2\x80\x99})\n 9 | if (p1 == (Position){10UL, 10UL}) {}\n | ^~\nRun Code Online (Sandbox Code Playgroud)\n看起来我不能在表达式中使用未命名的结构文字?在这个文档中,https://en.cppreference.com/w/c/language/compound_literal,我没有看到有这样的限制。
\n你能指出我使用上面的结构文字有什么问题吗?
\n我正在使用 gcc 9.4.0。我可以看到它支持以下C标准:\nc11\nc17\nc18\nc1x\nc2x\nc89\nc90\nc99\nc9x
\n该问题与复合文字无关。
您收到错误是因为您尝试==在两个结构上使用运算符。该==运算符不能用于比较两个结构。
C 标准的 6.5.9p2 节描述了==and运算符的约束!=:
应满足下列条件之一:
- 两个操作数都是算术类型;
- 两个操作数都是指向兼容类型的限定或非限定版本的指针;
- 一个操作数是指向对象类型的指针,另一个是指向 void 的限定或非限定版本的指针;或者
- 一个操作数是指针,另一个是空指针常量。
并且 astruct不是有效的操作数。
您需要单独检查结构的每个字段。
if (p1.x == 10L && p1.y == 10L)
Run Code Online (Sandbox Code Playgroud)