Разумеется, по дефолту должен стоять последний стандарт, т.к. он перекрывает предыдущий. gcc extensions штука, бесспорно, мерзкая, и тем, кто их придумал, надо оторвать головы, но, по крайней мере, код, написанный в соответствии со стандартом, будет им верно скомпилирован.
MSDN к стандарту C++ не имеет никакого отношения. В стандарте ничего про ключи компилятора не написано. Компилятор, соответствующий стандарту, должен ему соответствовать по умолчанию, а не предлагать искать какие-то ключи в MSDN, чтобы начать ему соответствовать.
Ты не понял
В MSDN не приводится стандарт, в MSDN приводится выдержка из стандарта:
The C++ standard says that a variable declared in a for loop shall go out of scope after the for loop ends.
И компилятор C++ по умолчанию этому стандарту соответствует. А вот чтобы разрешить повторное объявление i в следующем цикле, надо искать ключи компилятора.
Для того, чтобы узнать, что думает стандарт, надо смотреть в стандарт, а не в MSDN. Standard C++ - ISO-IEC 14882-1998, пункт 3.3.2.4. Переменная, объявленная в цикле for, должна быть видна только в этом цикле. Все остальное - нарушение стандарта.
Перерыв пол-инета, таки нашёл, где скачать этот доступный только за деньги стандарт
776 страниц в pdf, нехило, да, смотрим пункт 3.3.2.4:
Names declared in the for-init-statement, and in the condition of the if, while, for, and switch statements are local to the if, while, for, or switch statement (including the controlled statement), and shall not be redeclared in subsequent condition of that statement nor in the outermost block (or, for the if statement, any of the outermost blocks) of the controlled statement; see 6.4.
Переменная признаётся локальной по отношению к блоку, да, обращаться к ней за пределами блока нельзя, да, но при этом всём переобъявлять её вне блока тоже нельзя (выделено жирным).
Names declared in the for-init-statement, and in the condition of the if, while, for, and switch statements are local to the if, while, for, or switch statement (including the controlled statement), and shall not be redeclared in subsequent condition of that statement nor in the outermost block (or, for the if statement, any of the outermost blocks) of the controlled statement; see 6.4.
Почему-то (сейчас не знаю почему) под словами go out of scope мне нарисовалась ситуация, когда переменная выходит за пределы блока и продолжает спокойно жить В то время как это общепринятый оборот, обозначающий уничтожение переменной в связи с достижением границ блока
Причём! Именно это и написано в оригинальной цитате из MSDN - там правильно говорится, что стандарт требует, чтобы переменная go out of scope, т.е. сдохла, а не вышла на прогулку, как показалось мне И статья KB167748 (и как раз её я пропустил, а смотрел другую) как раз объясняет, что это происходит, когда включены расширения компилятора, и показывает, как их отключить
Вывод:
- в MSDN стандарт приведён правильно (и нефиг говорить, что туда не надо ходить за стандартом)
- VC6 рулит, ибо и имеет полезные расширения синтаксиса C++, и позволяет отключить их (Project, Settings, and then click the C/C++ Tab. Change the Category to Customize and select Disable Language Extensions)
Рулить VC начал, когда научился грамотно компилить темплейты. Расширение синтаксиса != нарушение стандарта. gcc extensions - это расширение, а вот неверная компиляция переменных, объявленных в цикле - это нарушение.
В MSDN стандарта вообще нет, а только кое-где приведены фразы, имеющие к нему более-менее прямое отношение.