1

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

代码:

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

错误:

警告:(etoa:1643):发现缩小或有符号到无符号的类型转换:int 到 unsigned char

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

4

1 回答 1

2

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,并且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";
}
于 2013-04-18T01:15:09.047 回答