当我用这种方式用g ++ 4.8.1(64位)编译下面的代码时:
$ g++ -Wconversion -o main main.cpp
Run Code Online (Sandbox Code Playgroud)
我得到这个结果:
main.cpp: In function ‘int main()’:
main.cpp:12:20: warning: conversion to ‘int’ from ‘long unsigned int’ may alter its value [-Wconversion]
int i = sizeof(x)/sizeof(x[0]);
^
Run Code Online (Sandbox Code Playgroud)
我的期望是编译器应该能够在编译时评估表达式.如果你用普通c制作一个类似的程序,gcc就像一个魅力.
这应该被认为是g ++中的一个错误(例如clang ++没有这个问题)?
如果您将有问题的行更改为:
char c = 0x10000000/0x1000000;
Run Code Online (Sandbox Code Playgroud)
然后编译器不会抱怨.这表明在警告生成之前进行了一些持续的评估.
main.cpp中:
#include <iostream>
struct foo {
int a;
int b;
};
foo x[50];
int main()
{
int i = sizeof(x)/sizeof(x[0]);
std::cout << i << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
int i = sizeof(x)/sizeof(x[0]);
//int <-- std::size_t <-- std::size_t / std::size_t
Run Code Online (Sandbox Code Playgroud)
表达式的类型sizeof(x)/sizeof(x[0])是std::size_t您机器上的类型unsigned long int.因此int,如果源的大小大于目标,则从此类型转换为数据丢失.
虽然,我同意在你的情况下,如果编译器实际计算值,就不会有实际的数据丢失,但我想它在实际计算之前适用.-Wconversion
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |