Почему в g ++ предупреждение о неинициализированной переменной зависит от типа переменной? (он предупреждает о int, но не о двойном) - PullRequest
12 голосов
/ 14 февраля 2011

В настоящее время я пытаюсь понять, в каких случаях g ++ предупреждает о неинициализированных переменных. Рассмотрим следующий фрагмент кода:

#include <iostream>

typedef double barType;

struct foo {

    barType bar;

};

int main() {

    foo f;

    std::cout << f.bar << std::endl;

}

Если я скомпилирую это так, я не получу предупреждения:

$ g++ -O1 -Wall test.cc -o test

но если я изменю barType на int:

$ g++ -O1 -Wall test.cc -o test
  test.cc: In function ‘int main()’:
  test.cc:17: warning: ‘f.foo::bar’ is used uninitialized in this function

Как предупреждение может зависеть от типа? Он неинициализирован в обоих случаях.

Я использую:

$ g++ --version
g++ (Ubuntu 4.4.1-4ubuntu9) 4.4.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Спасибо

Кто

Ответы [ 4 ]

11 голосов
/ 14 февраля 2011

Это неопределенное поведение, которое не требуется диагностировать, поэтому компилятор может сам принять решение.Они могли бы сделать лучше.

1 голос
/ 14 февраля 2011

Вы можете получить это, чтобы предупредить, если вы компилируете с -O. Я не совсем понимаю, почему, но если бы мне пришлось угадывать это для целей скорости компиляции, то есть это уже нужно выяснить для оптимизации, поэтому будет сообщать только тогда, когда вы хотите оптимизировать.

Существует также -Wuninitialized, который на самом деле не включен во «все», но это также требует -O в любом случае. По крайней мере, если вы сделаете -Wuninitialized, компилятор предупредит вас, что не может предупредить вас ...

<code>cc1plus: warning: -Wuninitialized is not supported without -O

Один хороший вывод из этого - то, что Уолл плохо назван. Существуют и другие параметры -W, не включенные во «все». Обратитесь к документации для получения дополнительной информации.

1 голос
/ 14 февраля 2011

По-видимому, они могут быть более озабочены использованием неинициализированных целочисленных типов, чем, скажем, float или double, поскольку вы можете использовать целочисленные типы со смещением указателя без приведения, что может быть очень плохо (tm)

0 голосов
/ 14 февраля 2011

Стандарт C ++ здесь не требует ничего подобного. Таким образом, компиляторы могут делать все что угодно.

Смотрите еще одно хорошее наблюдение здесь:

Fun с неинициализированными переменными и компилятором (GCC)

...