当我编译下面以这种方式与G ++ 4.8.1(64位)代码:为什么G ++ 4.8.1问题转换警告
$ g++ -Wconversion -o main main.cpp
我得到这样的结果:
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]);
^
我的期望是编译器应该能够在编译时评估表达式。如果你用普通的c做类似的程序,gcc就像魅力一样。
这应该被认为是g ++中的一个bug(例如clang ++没有这个问题)?
如果你改变了有问题的行是这样的:
char c = 0x10000000/0x1000000;
那么编译器不抱怨。这表明一些不断的评估是在警告产生之前完成的。
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;
}
那是不是没有优化?试试'-O2',它应该在编译时评估它。 – Rup
我的确也收到了4.8的警告,但是我不会在4.9版本(大约一周前的GCC源代码)中出现,所以我认为GCC开发人员认为这是一个bug并且已经修复了它。 – hvd