为什么分配可能会丢失数据,而不是产生编译器警告
Why is assignment with possible loss of data NOT producing compiler warning
我正在使用MS Visual Studio 2017,并且(如前所述)我会收到编译器警告:
Warning C4244 '=': conversion from 'unsigned long' to 'unsigned short', possible loss of data
在此C 代码上:
unsigned long test32{70000};
unsigned short test16;
test16 = test32;
但是,当我使用cstdint typedefs时:
uint32_t test32{70000};
uint16_t test16;
test16 = test32;
...我根本没有任何编译器警告。为什么?
此外,作为一种严格的语言,C 的编译器不应给我错误而不是对任何一种方法的警告(并迫使我明确地将32位值施加到在第三行分配之前的16位)?
no。该标准不要求编译器如何发出诊断。请参阅[Defns.diagnostic]:
属于实现的实现定义子集的消息
是警告还是错误取决于编译器。要回答您的第二个问题,这似乎是Qoi问题。例如,GCC排放诊断:
g++ -std=c++11 -Wconversion test.cpp
test.cpp: In function ‘int main()’:
test.cpp:6:10: warning: conversion to ‘uint16_t {aka short unsigned int}’ from ‘uint32_t {aka unsigned int}’ may alter its value [-Wconversion]
test16 = test32;
您可以尝试使用Visual Studio中的警告设置弄乱或提交错误报告。
相关文章:
- 如何修复编译器警告 C6386 和 C6385?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 为什么布尔开关语句有编译器警告?
- 奇怪的缩小转换在 g++ 编译器中加倍到浮点警告
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- 使用 reverse_iterator 而不是const_reverse_iterator并获得讨厌的编译器警告和错误
- 添加 c++11 编译器后打开 devc++ 时显示的警告
- 来自 std::chrono 的编译器警告,但未被使用
- 警告级别为 3 的 int 的 std::vector push_back 处的编译器警告
- G++ 编译器未为未定义的方法生成错误/警告
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 有没有办法在从临时返回按值string_view时获得编译器警告?
- 常量更改而不const_cast<> 为什么没有编译器警告/错误?
- 为什么编译器不在同一翻译单元中警告 ODR 违规
- C++语法错误,编译器不会警告或 int v = func(&v) 出错;
- C++ 添加编译器警告,以错误使用自定义打印/日志功能
- 我正在尝试在我的类中创建一个静态成员,但编译器警告我它是未定义的
- 是否可以将移动的变量标记为不再可用,并在使用它时收到编译器警告?
- 为什么我应该始终启用编译器警告
- 使用Boost :: black在boost :: variant中使用时,请警告编译器