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
一方面,由于相等运算符表达式的类型是 int
而 bool
的类型(在本例中)显然是 unsigned char
,警告似乎说得通。另一方面,代码看起来很标准。它不应该在没有警告的情况下编译吗?什么是标准说法?
警告是适当的,但学究气。 ==
的结果肯定是 int
(C 1999,§6.5.9 ¶3)。 _Bool
(bool
扩展成的内容)是 标准无符号整数类型之一 (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 在评论中指出 _Bool
和 unsigned char
在 C 中是不同的类型,不能被视为兼容类型。
我正在使用 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
一方面,由于相等运算符表达式的类型是 int
而 bool
的类型(在本例中)显然是 unsigned char
,警告似乎说得通。另一方面,代码看起来很标准。它不应该在没有警告的情况下编译吗?什么是标准说法?
警告是适当的,但学究气。 ==
的结果肯定是 int
(C 1999,§6.5.9 ¶3)。 _Bool
(bool
扩展成的内容)是 标准无符号整数类型之一 (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 在评论中指出 _Bool
和 unsigned char
在 C 中是不同的类型,不能被视为兼容类型。