IF语句中的复合文字

时间:2012-05-09 07:34:40

标签: c if-statement compound-literals

我尝试使用这个小代码在IF语句中使用复合文字:

#include<stdio.h>

struct time
{
    int hour;
    int minutes;
    int seconds;
};

int main(void)
{
    struct time testTimes;
    testTimes = (struct time){12,23,34};

    if (testTimes == (struct time){12,23,34})
        printf("%.2i:%.2i:%.2i\n", testTimes.hour, testTimes.minutes, testTimes.seconds);
    else
        printf("try again !\n");
    return 0;
}

它不起作用。它在编译时给出了以下消息:

  

prac.c:15:16:错误:无效操作数到二进制==(有'结构时间'   和'结构时间')

是否不允许在IF语句中使用复合文字或语法不正确?

4 个答案:

答案 0 :(得分:3)

您无法使用==比较结构。

您应该分别比较结构的每个成员。

答案 1 :(得分:3)

为什么你不能使用==运算符

来比较结构,这是一个很好的理由

引自C FAQ

  

编译器没有很好的方法来实现结构比较   (即支持结构的==运算符)是一致的   C的低级味道。 一个简单的逐字节比较即可   随机位的创始人出现在结构中未使用的“洞”中   (这种填充用于保持后面字段的对齐正确)。   逐场比较可能需要不可接受的数量   大型结构的重复代码。任何编译器生成的   不能期望比较指针字段   适用于所有情况:例如,通常适合   比较char *字段与strcmp而不是==。

     

如果你需要比较两种结构,你必须自己编写   功能这样做,逐字段。

答案 2 :(得分:1)

c没有提供语言功能来进行==结构的比较

答案 3 :(得分:1)

您无法比较结构。标准(C11 6.5.9 Equality operators)声明:

  

One of the following shall hold:
  - both operands have arithmetic type;
  - both operands are pointers to qualified or unqualified versions of compatible types;
  - one operand is a pointer to an object type and the other is a pointer to a qualified or unqualified version of void; or
  - one operand is a pointer and the other is a null pointer constant.

遗憾的是,这些都不适用于struct time。您必须使用==&&单独检查字段,或者使用单独的不变结构与memcmp进行比较。

虽然请记住后一个建议可能会与结构中的填充信息冲突,所以前者可能是最好的选择,除非你知道没有填充。