Подтвердить что ты не робот

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

В настоящее время я пытаюсь понять, в каких случаях 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.

Спасибо,

Кто-нибудь

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

cc1plus: warning: -Wuninitialized is not supported without -O

Один хороший отход от этого состоит в том, что -Wall плохо назван. Существуют и другие опции -W, не включенные в "все". Подробнее см. В документах.