不能在最新的 C 表达式中使用未命名的结构文字?

my_*_*ion 1 c

这是我的代码:

\n
void 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}\n
Run Code Online (Sandbox Code Playgroud)\n

gcc 给我这个编译错误:

\n
t.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      |            ^~\n
Run 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

dbu*_*ush 5

该问题与复合文字无关。

您收到错误是因为您尝试==在两个结构上使用运算符。该==运算符不能用于比较两个结构。

C 标准的 6.5.9p2 节描述了==and运算符的约束!=

应满足下列条件之一:

  • 两个操作数都是算术类型;
  • 两个操作数都是指向兼容类型的限定或非限定版本的指针;
  • 一个操作数是指向对象类型的指针,另一个是指向 void 的限定或非限定版本的指针;或者
  • 一个操作数是指针,另一个是空指针常量。

并且 astruct不是有效的操作数。

您需要单独检查结构的每个字段。

if (p1.x == 10L && p1.y == 10L)
Run Code Online (Sandbox Code Playgroud)