diab 5.7编译器中的逻辑与运算符返回非bool类型

Logical AND operator in diab 5.7 compiler returns non-bool type

本文关键字:运算符 返回 类型 bool 编译器 diab      更新时间:2023-10-16

当使用diab c++编译器(dplusplus)编译以下代码位时,它会在第三行生成一个转换警告。它可以通过将(&&)操作符的结果强制转换为bool以外的任何值来解决。

代码:

bool first = 1;
bool second = 1;
bool ret = (first && second); //generates compile warning
错误:

warning: (etoa:1643):窄化或有符号到无符号类型转换发现:int到unsigned char

我验证了没有任何东西定义bool为另一种类型。这看起来像编译器问题吗,还是我可能缺少的其他东西可能导致这种情况?

Wind River网站表明Diab编译器既可以编译C也可以编译c++。

在C中,&&运算符产生类型为int的结果,其值为01。这和你看到的警告是一致的。

在1990年的ISO标准中,C语言没有内置的bool类型。通常将bool定义为类型定义。从消息中可以看出,boolunsigned char的类型定义,可能在某些头中。1999年ISO C标准增加了一个新的预定义布尔类型_Bool;标识符bool<stdbool.h>中定义为扩展为_Bool的宏。但如果<stdbool.h>不包括在内,bool可以用其他方式定义。

在c++中,&&产生类型为bool的结果,其值为falsetrue,而bool是一个不同的基本类型。至少从1998年ISO c++标准开始就是这样。

我强烈怀疑你得到这个警告是因为你将代码编译为C而不是c++。一个不太可能的可能性是Diab编译器不完全符合c++标准;它可能有一种方法告诉它更紧密地遵从。

我没有使用Diab编译器。通常,您可以通过使用特定的文件扩展名(通常是C的.c和c++的.cpp),或使用不同的命令,或两者兼而有之,来控制正在编译的语言。

查阅编译器的文档,了解如何将其作为符合标准的c++编译器调用。

作为一个实验,在改变调用编译器的方式之前,您可以尝试添加一个声明:
int class;

到源文件。这在C中是合法的,但在c++中是语法错误(因为class是c++关键字)。

更新:

OP说他肯定编译为c++,而不是C。但是警告信息暗示&&产生int,并且boolunsigned 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";
}