c++ - diab 5.7 编译器中的逻辑 AND 运算符返回非 bool 类型

标签 c++

当使用 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 类型的结果, 值为 01 .这与您看到的警告一致。

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

在 C++ 中,&&产生 bool 类型的结果值为 falsetrue , 和 bool是一个独特的基本类型。至少自 1998 年 ISO C++ 标准以来就是这种情况。

我强烈怀疑您收到此警告是因为您将代码编译为 C 而不是 C++。不太可能的可能性是 Diab 编译器不完全符合 C++ 标准;它可能有办法告诉它更紧密地符合。

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

查阅编译器的文档,了解如何将其作为符合标准的 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";
}

关于c++ - diab 5.7 编译器中的逻辑 AND 运算符返回非 bool 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16072750/

相关文章:

c++ - Windows Phone 8 上的 CCTMXTiledMap (Cocos2d-x) 错误

c++ - const char** 是什么样的?

java - NDK 支持不同的 Product Flavor

c++ - 带 if 条件的作用域锁

C++ union 定义

c++ - 使用应用程序的 Windows API commctrl.h 无法在没有 Platform SDK 的计算机上运行

C++ stringstreams with std::hex

c++ - 计算二维平面上单应性的精度

c++ - 如何匹配通过引用传递给模拟函数的结构的字段?

c++ - SVM 分类器(响应数组必须包含与样本总数一样多的元素)