Wind River 的网站表明 Diab 编译器可以编译 C 或 C++。
在 C 中,&&运算符产生一个类型为 的结果int,其值为0or 1。这与您看到的警告一致。
从 1990 年 ISO 标准开始,C 没有内置bool类型。通常定义bool为 typedef。从消息中可以看出,它bool是 的 typedef unsigned char,可能在某些标头中。1999 ISO C 标准添加了一个新的预定义布尔类型,称为_Bool; 标识符bool被定义<stdbool.h>为扩展为 的宏_Bool。但如果<stdbool.h>不包括在内,bool可以用其他方式定义。
在 C++ 中,&&产生一个bool值为falseor的类型的结果true,并且bool是一个独特的基本类型。至少从 1998 年 ISO C++ 标准开始就是这种情况。
我强烈怀疑您收到此警告是因为您将代码编译为 C 而不是 C++。不太可能的可能性是 Diab 编译器不完全符合 C++ 标准。它可能有办法告诉它更紧密地符合。
我没有使用过 Diab 编译器。通常,您可以通过使用特定的文件扩展名(通常.c用于 C 和.cppC++)或使用不同的命令或两者兼而有之来控制正在编译的语言。
请查阅编译器的文档以了解如何将其作为符合标准的 C++ 编译器来调用。
作为一个实验,在更改调用编译器的方式之前,您可以尝试添加一个声明:
int class;
到您的源文件。这在 C 中是合法的,但在 C++ 中是语法错误(因为class是 C++ 关键字)。
更新:
OP 说他肯定是编译为 C++,而不是 C。但警告消息暗示&&yield 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";
}