将 int 分配给 Short 时没有警告(gcc)
我经常使用将“较长”类型变量分配给“较短”类型变量,例如将 int
分配给 short
或将 uint32_t
分配给 uint8_t< /代码>。有一天,我决定使用 gcc 在我的代码中查找所有此类情况,但令我惊讶的是 gcc 没有输出任何警告!
int long_value;
short short_value;
std::cin >> long_value; // Example input: 32769
short_value = long_value; // MS Visual Studio complains here at warning level 4
std::cout << "Long: " << long_value << '\n'; // My example output: 32769
std::cout << "Short: " << short_value << '\n'; // My example output: -32767
使用 gcc -Wall 或 gcc -Wconversion 没有帮助(gcc 没有输出任何警告)。实际上,它从不针对任何输入和输出类型(例如long
和unsigned char
)输出任何警告。
我从未在 gcc 中发现实际的错误,所以我几乎确定这种行为是有原因的。
那么为什么没有警告呢?
更新:我使用 gcc 4.1.2。
I often use assignment of "longer" typed variables to "shorter" ones, for example int
to short
or uint32_t
to uint8_t
. One day i decided to find all such cases in my code using gcc, but found to my amazement that gcc didn't output any warnings!
int long_value;
short short_value;
std::cin >> long_value; // Example input: 32769
short_value = long_value; // MS Visual Studio complains here at warning level 4
std::cout << "Long: " << long_value << '\n'; // My example output: 32769
std::cout << "Short: " << short_value << '\n'; // My example output: -32767
Using gcc -Wall
or gcc -Wconversion
didn't help (gcc didn't output any warning). Actually, it never output any warning for any input and output type (e.g. long
and unsigned char
).
I have never found an actual bug in gcc so i am almost sure this behavior has a reason.
So why no warning?
Update: i use gcc 4.1.2.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这个功能是在gcc 4.3版本中添加的。以前这是不可用的。
我希望您使用的是 gcc 4.2 或更低版本。
http://gcc.gnu.org/wiki/NewWconversion 证实了这一点。
这个错误:http://gcc.gnu.org/bugzilla/show_bug.cgi? id=2707 也谈到了这一点。
This feature was added in gcc 4.3 version. Previously this was not available.
I hope you are using gcc version 4.2 or below.
http://gcc.gnu.org/wiki/NewWconversion confirms this.
This bug: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=2707 also talks about it.
我无法重现这一点。使用 gcc 4.4.5 和 -Wconversion 编译此代码,我得到
I can't reproduce that. Compiling this code with gcc 4.4.5 with -Wconversion, I get