当使用 diab c++ 编译器 (dplusplus) 编译以下代码时,它会在第三行生成转换警告。它可以通过将 (&&) 运算符的结果转换为除 bool 以外的任何内容来解决。
代码:
bool first = 1;
bool second = 1;
bool ret = (first && second); //generates compile warning
错误:
warning: (etoa:1643): narrowing or signed-to-unsigned type conversion found: int to unsigned char
我确认没有将 bool 定义为另一种类型。这看起来像是编译器问题,还是我可能遗漏了其他可能导致此问题的问题?
最佳答案
Wind River's web site表示 Diab 编译器可以编译 C 或 C++。
在 C 中,&&
运算符产生 int
类型的结果, 值为 0
或 1
.这与您看到的警告一致。
截至 1990 年的 ISO 标准,C 没有内置 bool
类型。通常定义 bool
作为类型定义。从消息中可以看出 bool
是 unsigned char
的类型定义,可能在某些标题中。 1999 ISO C 标准添加了一个名为 _Bool
的新预定义 bool 类型。 ;标识符 bool
在 <stdbool.h>
中定义作为扩展为 _Bool
的宏.但是如果 <stdbool.h>
不包括在内,bool
可以用其他方式定义。
在 C++ 中,&&
产生 bool
类型的结果值为 false
或 true
, 和 bool
是一个独特的基本类型。至少自 1998 年 ISO C++ 标准以来就是这种情况。
我强烈怀疑您收到此警告是因为您将代码编译为 C 而不是 C++。不太可能的可能性是 Diab 编译器不完全符合 C++ 标准;它可能有办法告诉它更紧密地符合。
我没有使用过 Diab 编译器。通常,您可以通过使用特定的文件扩展名(通常是 .c
用于 C 和 .cpp
用于 C++)或使用不同的命令或同时使用这两种方式来控制正在编译的语言。
查阅编译器的文档,了解如何将其作为符合标准的 C++ 编译器调用。
作为实验,在更改调用编译器的方式之前,您可以尝试添加一个声明:
int class;
到你的源文件。这在 C 中是合法的,但在 C++ 中是语法错误(因为 class
是 C++ 关键字)。
更新:
OP 说他肯定是编译为 C++,而不是 C。但是警告消息暗示 &&
产量 int
,那bool
与 unsigned char
的类型相同.
警告并不直接表明编译器不符合标准;编译器可以警告他们喜欢的任何事情。但是这个警告的内容确实暗示了一个编译器错误,或者至少是一个不符合任何 C+ 的编译器
任何符合标准的 C++ 编译器都必须为此程序生成诊断信息。你的编译器是做什么的? (请不要添加任何 #include
指令。)
int main() {
class dummy { }; // Just to make sure it's C++
bool b;
unsigned char c;
bool* pb = &c; // Invalid conversion
unsigned char* pc = &b; // Invalid conversion
}
当你编译和执行这个程序时你会得到什么输出?
#include <iostream>
int main() {
std::cout << "__cplusplus = " << __cplusplus << "\n";
}
关于c++ - diab 5.7 编译器中的逻辑 AND 运算符返回非 bool 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16072750/