【发布时间】:2018-07-21 05:50:47
【问题描述】:
我的 C++ 程序中有 uint64_t 常量(QtCreator 4.6.1 中的 clang 6.0.1)。
例如:
uint64_t a = 0xffffffffffffffffULL;
问题是,我在 IDE 中收到以下警告:
Warning: implicit conversion from 'unsigned long long' to 'uint64_t' (aka 'unsigned long')
我也尝试将其更改为以下内容但没有成功:
uint64_t a = UINT64_C(0xffffffffffffffff);
uint64_t a = 0xffffffffffffffffUL;
我可以选择使用 C++14 标准和选项进行计算:-Wconstant-conversion
检查类型大小:
std::cout << "uint64_t " << sizeof (uint64_t) << std::endl;
std::cout << "unsigned long " << sizeof (unsigned long) << std::endl;
std::cout << "unsigned long long " << sizeof (unsigned long long) << std::endl;
结果:
uint64_t 8
unsigned long 8
unsigned long long 8
知道如何解决这个问题以及为什么 IDE 认为正在发生大小转换?
编辑:我刚刚检查了宏扩展:
define UINT64_C(c) c ## UL
这意味着提供的示例应该可以工作,但它不能:
uint64_t a = 0xffffffffffffffffUL;
【问题讨论】:
-
答案在您的警告信息中!请仔细阅读。
-
可能相关:question 1, question 2
-
@Someprogrammerdude - 是的,我试过了。用示例更新了问题。不,答案不在警告中。
-
@Ross 如果您的编译器将
0xffffffffffffffffUL视为unsigned long long常量(因为您说错误仍然显示“从'unsigned long long' 转换”),那么您的unsigned long类型不会' t 有 64 位。如果您的标头仍然将uint64_t定义为unsigned long,那么就大错特错了。您是否不小心使用了另一个平台的标题?但是,这与测试程序的输出不匹配。 -
@hvd 这似乎确实是混合标头的问题。我试图将定义复制到另一个文件中,但警告未显示在其中。
标签: c++ c++14 qt-creator