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