为什么g ++ 4.8.1发出转换警告

时间:2014-01-16 13:56:04

标签: c++ gcc

当我用这种方式用g ++ 4.8.1(64位)编译下面的代码时:

$ 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 ++中的一个错误(例如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;
}

2 个答案:

答案 0 :(得分:7)

 int i = sizeof(x)/sizeof(x[0]);
 //int <-- std::size_t <-- std::size_t / std::size_t

表达式sizeof(x)/sizeof(x[0])的类型std::size_t,在您的计算机上为unsigned long int。因此,如果源的大小超过目标,则从此类型转换为int会导致数据丢失。

尽管如此,我同意在您的情况下,如果编译器实际计算该值,会导致实际数据丢失,但我猜它适用{{1在实际计算之前。

答案 1 :(得分:0)

sizeof()会向您发送std::size_t而不是int!所以投了它或将i声明为std::size_t

 std::size_t i = sizeof(x)/sizeof(x[0]);