【发布时间】:2014-01-16 13:56:03
【问题描述】:
当我以这种方式用 g++ 4.8.1 (64bit) 编译下面的代码时:
$ 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,它应该在编译时评估它。 -
我确实在 4.8 中也收到了警告,但在 4.9 版中我没有(大约一周前的 GCC 来源),所以我认为 GCC 开发人员确实认为这是一个错误并且有已经修好了。