Ответ 1
Это поведение undefined, которое не требуется для диагностики, поэтому компилятор может свободно судить. Они могли бы сделать лучше.
В настоящее время я пытаюсь понять, в каких случаях 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.
Спасибо,
Кто-нибудь
Это поведение undefined, которое не требуется для диагностики, поэтому компилятор может свободно судить. Они могли бы сделать лучше.
В предположении, что они могут быть более заинтересованы в том, что интегральные типы используются неинициализированными, чем float или double, поскольку вы можете использовать интегральные типы с смещениями указателей без кастинга, которые могут быть очень плохими (tm)
Вы можете получить это, чтобы предупредить, если вы компилируете с -O. Я не совсем понимаю, почему, но если мне нужно было догадаться, что это для целей скорости компиляции, т.е. Уже нужно это понять для оптимизации, так что будет только сообщать, когда вы хотите оптимизировать.
Существует также -Унициализация, которая на самом деле не включена в "все", но это также требует -O. По крайней мере, если вы выполните -Унициализированный, компилятор предупредит вас, что он не может вас предупредить...
cc1plus: warning: -Wuninitialized is not supported without -O
Один хороший отход от этого состоит в том, что -Wall плохо назван. Существуют и другие опции -W, не включенные в "все". Подробнее см. В документах.
В стандарте С++ нет ничего подобного. Поэтому компиляторы могут делать все, что им нравится.
Смотрите еще одно хорошее наблюдение здесь:
Развлечения с неинициализированными переменными и компилятором (GCC)