DIB 5.7编译器中的逻辑AND运算符返回非布尔类型 当用DIAB+C++编译器(DPLUS PLUS)编译以下代码时,它会在第三行上生成转换警告。它可以通过将(&&)运算符的结果强制转换为bool以外的任何对象来解决

DIB 5.7编译器中的逻辑AND运算符返回非布尔类型 当用DIAB+C++编译器(DPLUS PLUS)编译以下代码时,它会在第三行上生成转换警告。它可以通过将(&&)运算符的结果强制转换为bool以外的任何对象来解决,c++,C++,代码: 错误: 警告:(etoa:1643):缩小或有符号到无符号类型转换 找到:int到无符号字符 我验证了没有将bool定义为其他类型。这看起来像是编译器问题,或者是不是还有别的东西会导致这个问题?< P>表明DIABR编译器可以编译C或C++ +< /P> 在C语言中,&&运算符生成类型为int的结果,值为0或1。这与你看到的警告是一致的 截至1990年的ISO标准,C没有内置的bool类型。通常将bool定义为typedef。从消息中可以看出,bool是unsigned char的typ

代码:

错误:

警告:(etoa:1643):缩小或有符号到无符号类型转换 找到:int到无符号字符

我验证了没有将bool定义为其他类型。这看起来像是编译器问题,或者是不是还有别的东西会导致这个问题?

< P>表明DIABR编译器可以编译C或C++ +< /P> 在C语言中,
&&
运算符生成类型为
int
的结果,值为
0
1
。这与你看到的警告是一致的

截至1990年的ISO标准,C没有内置的
bool
类型。通常将
bool
定义为typedef。从消息中可以看出,
bool
unsigned char
的typedef,可能在某些头中。1999年的ISO C标准增加了一种新的预定义布尔类型,称为
\u Bool
;标识符
bool
中定义为扩展到
\u bool
的宏。但是,如果不包括
,则可以用其他方式定义
bool

在C++中,>和产生类型<代码> BOOL 结果,值Value或Trime, BOOL是一个明显的基本类型。这至少是自1998个ISO C++标准以来的情况。 我强烈怀疑你得到了这个警告,因为你把代码编译成C而不是C++。一个不太可能的可能性是DIABR编译器不完全符合C++标准;它可能有一种方法告诉它更紧密地符合

我还没有使用Diab编译器。通常,您可以通过使用特定的文件扩展名(对于c,通常为
.c
,对于c++,通常为
.cpp
)或使用不同的命令,或同时使用这两种命令来控制正在编译的语言

查阅编译器的文档,以了解如何调用它作为一个符合C++编译器。

作为实验,在更改调用编译器的方式之前,可以尝试添加声明:

int class;
到您的源文件。这在C中是合法的,但是C++中的语法错误(因为类< /Cord>是C++关键字)。 更新:

OP说他肯定是编译为C++,而不是C。但是警告消息意味着<代码> & & <代码>收益>代码> int >代码>,并且<代码>布尔O/C> >与“代码>未签名char < /C> >相同。 警告并不直接表明编译器不符合要求;编译器可以警告他们喜欢的任何东西。但是这个警告的内容确实表明了一个编译器错误,或者至少是一个不符合任何C语言的编译器+

<> P>任何符合C++编译器的编译器必须为该程序生成诊断。你的编译器是做什么的?(请不要添加任何
#包括
指令。)

当你编译和执行这个程序时,你会得到什么样的输出

#include <iostream>
int main() {
    std::cout << "__cplusplus = " << __cplusplus << "\n";
}
#包括
int main(){

在C++中,代码< >和< /COD>产生值为0或1的类型<代码> int >代码。在C++的早期版本中,它也做同样的事情吗?这个编译器有多大?你确定你是把它作为C++编译器调用,而不是作为C编译器吗?如果你尝试添加一个声明<代码> int类,< /代码>会怎么样?我的感觉是它是一个COM。PILER问题,确实,但是它有助于确认你有一个C++标准,它实际上有<代码> BoOL 。@ MatsPetersson:消息暗示<代码> BOOL是(TyPufFF?)<代码>未签名char <代码> @ @ MatsPetersson:C++的代码> & & <代码>产生了 BOOL 结果,并且 BOOL是一个明显的基本类型,至少是从1998个ISO C++标准开始的。我怀疑是一个过时的C++编译器,还是一个编译器,作为C编译器。与这个问题无关,但是<代码> BooLoope=真;E>会更习惯。它在C++中是最有意义的编译。我最初在类方法中发现了这个问题。另外,它调用DPUS(C++编译器)而不是DCC(C编译器)。格兰特:有趣。编译器有控制它的标准一致性的标准和/或它试图遵守的C++标准的版本吗?@格兰特,我怀疑你无意中包含了一个头文件,它的代码是<代码> TyPulf< /Cuff>,代码是<重写内置C++类型>。L 是C++关键字;<代码> Boo.<代码>的TyPulf将是一个语法错误。@ KeththpPsPon,它应该是一个语法错误,但是如果不是,那么bug就会很小。
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";
}