为什么分配可能会丢失数据而不会产生编译器警告

问题描述 投票:3回答:1

我正在使用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位) )?

c++ casting warnings stdint
1个回答
0
投票

不是。该标准没有规定编译器如何发出诊断。见[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中的警告设置尝试messing around,也可以提交错误报告。

© www.soinside.com 2019 - 2024. All rights reserved.