C99:等于运算符表达式到 bool 转换警告

C99: Equality operator expression to bool conversion warning

我正在使用 WindRiver Diab for Power PC 编译以下代码,这是一种用于嵌入式系统的专有 C99 编译器:

  #include <stdbool.h>
  
  bool foo(int a, int b)
  {
      return a == b; /* int to unsigned char conversion */
  }

我原以为这段代码可以在没有警告的情况下编译,但事实并非如此,编译器报告:

warning: ... signed-to-unsigned type conversion found: int to unsigned char

一方面,由于相等运算符表达式的类型是 intbool 的类型(在本例中)显然是 unsigned char,警告似乎说得通。另一方面,代码看起来很标准。它不应该在没有警告的情况下编译吗?什么是标准说法?

警告是适当的,但学究气。 == 的结果肯定是 int(C 1999,§6.5.9 ¶3)。 _Boolbool 扩展成的内容)是 标准无符号整数类型之一 (C 1999,§6.2.5 ¶6)。当然,bool 扩展为 _Bool(C 1999,§7.16 ¶2)。

但是,由于 == 的结果是 0 或 1,编译器可以推断它不会因转换而受到任何不良影响,并且可以抑制警告。特别是,转换为 _Bool 明确定义为 0 或 1(C 1999,§6.3.1.2 ¶1)。

问题中显示的警告没有提到转换为 bool_Bool,而是提到 unsigned char。这似乎不合适,并且是编译器质量可以提高的另一个迹象。

为了比较,GCC 要求专门添加 -Wconversion 以获得这些转换警告。即使有标志,GCC 在将 == 的结果转换为 unsigned 时也不会生成任何警告。而且,对于 _Bool.

的任何算术转换(包括负值),它不会生成任何警告

Keith Thompson 在评论中指出 _Boolunsigned char 在 C 中是不同的类型,不能被视为兼容类型。