diab 5.7编译器中的逻辑与运算符返回非bool类型
Logical AND operator in diab 5.7 compiler returns non-bool type
当使用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
的结果,其值为0
或1
。这和你看到的警告是一致的。
在1990年的ISO标准中,C语言没有内置的bool
类型。通常将bool
定义为类型定义。从消息中可以看出,bool
是unsigned char
的类型定义,可能在某些头中。1999年ISO C标准增加了一个新的预定义布尔类型_Bool
;标识符bool
在<stdbool.h>
中定义为扩展为_Bool
的宏。但如果<stdbool.h>
不包括在内,bool
可以用其他方式定义。
在c++中,&&
产生类型为bool
的结果,其值为false
或true
,而bool
是一个不同的基本类型。至少从1998年ISO c++标准开始就是这样。
我强烈怀疑你得到这个警告是因为你将代码编译为C而不是c++。一个不太可能的可能性是Diab编译器不完全符合c++标准;它可能有一种方法告诉它更紧密地遵从。
我没有使用Diab编译器。通常,您可以通过使用特定的文件扩展名(通常是C的.c
和c++的.cpp
),或使用不同的命令,或两者兼而有之,来控制正在编译的语言。
查阅编译器的文档,了解如何将其作为符合标准的c++编译器调用。
作为一个实验,在改变调用编译器的方式之前,您可以尝试添加一个声明:int class;
到源文件。这在C中是合法的,但在c++中是语法错误(因为class
是c++关键字)。
更新:
OP说他肯定编译为c++,而不是C。但是警告信息暗示&&
产生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";
}
- 重载更少,则运算符返回相反的布尔值
- 使用重载 [] 运算符返回 std::map() 的可赋值
- 为什么我的超载"+"运算符返回的总额错误?
- (C++)为什么"||"逻辑运算符返回 1?
- 为流运算符返回代理类时解压缩参数
- C++ 运算符返回差异
- 重载运算符返回什么类型的值(对于用户定义的类型):右值还是左值?
- 运算符返回的指针的有效性 >
- 字符串流运算符>>返回值
- 动态指针引用数组由三元运算符返回值,但有异常
- 重载运算符返回的对象正在丢失 C++ 中的数据
- 如何使用设置运算符返回非 const 对象>
- 重载常量和非常量转换运算符返回数组类型时出现 MSVC 错误 C2593
- 为什么比较运算符"=="返回"YES"即使两个向量不同?
- 如何从重载的下标 [] 运算符返回 std::unique_ptr&?
- 从重载运算符返回对象>>
- 获取对运算符 [] 返回值unordered_map引用
- 我无法让这个虚拟模板化函子运算符返回正确的类型
- 为什么迭代器运算符 + 返回副本
- 从运算符[]返回对映射的char*的引用