2014-11-15 2 views
0

Я полностью сбит с толку some code Я пытаюсь скомпилировать. Компилятор дает мне несколько десятков ошибок «необъявленного идентификатора». Все они, как представляется, локальные переменные цикла, как это:Являются ли необъявленные переменные законными в C++?

for (i = 0; i < 100; i++) 

Я мог бы легко исправить, но я не понимаю, как этот код может быть скомпилирован для других людей. И эти файлы не были затронуты в возрасте.

Есть ли какой-то флаг компилятора для VC++, который автоматически принимает int для необъявленных переменных? Я не мог найти его. Что дает?


Минимальный полный пример кода, который воспроизводит проблему:

for (int i = 0; i < 100; i++); 
for (i = 0; i < 100; i++); 
+6

Какой компилятор предназначен для компиляции этого кода? Некоторые старые, несоответствующие компиляторы (в первую очередь, Visual Studio 6) имели область переменной, объявленной в цикле, проходящей мимо тела цикла, до конца охватывающего блока. Поэтому вы можете написать 'for (int i = 0; i <10; ++ i) {...} i = 42;' В этом файле, который вы цитируете, переменная 'iK'is сначала объявлена ​​и используется в строке 1784, и затем повторно использовать тело этого цикла. –

+0

@IgorTandetnik - Я думаю, вы только что его нашли ... код изначально был скомпилирован с помощью VC7 (не уверен, что Visual Studio, которая сейчас). Я надеялся, что VS2013 тоже скомпилируется. –

+2

Попробуйте построить с помощью '' /Zc:forScope-'](http://msdn.microsoft.com/en-us/library/84wcsx8x.aspx) –

ответ

5

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

Для компиляции такого кода с MSVC, добавить переключатель компилятора/Ze

См MSDN docs подробности.

Комментарий ниже предлагает/Zc: forScope, но в соответствии с this MSDN page это не так.

Кстати, G ++ имеет аналогичный переключатель -fno-for-scope.

+0

Невероятно! Это оно ! 'For (int iK ...)' в строке 1784 примера (в комментариях вопроса) определяет 'iK', и эта переменная остается тогда определенной до конца включения, которая начинается в 1783 и заканчивается в 1842. – Christophe

+0

А для записей G ++ имеет '-fno-for-scope' для той же цели. В руководстве они относятся к «коду старого стиля». Это на самом деле очень старый стиль, так как Stroustrup в выпуске «C++ Programming langage» с 2000 года уже объясняет, что переменная не видна после окончания for. – Christophe

+0

'/ Ze' [считается устаревшим] (http://msdn.microsoft.com/en-us/library/0k0w269d.aspx), однако'/Zc: forScope-'(обратите внимание на знак минус!) Сделал трюк , Спасибо! :) –

0

C++ является типизированным языком сайта. Одна из причин заключается в том, что вы должны объявлять переменные перед их использованием.

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

О понятном поведении состоит в том, что он помогает вам назвать хорошую версию перегруженной функции, проверяя тип аргументов. Эта проверка может быть выполнена во время компиляции, что повышает производительность во время выполнения.

Это наследуется от C, который является choser для сборки, а затем C++. Выделение переменных означает выделение пространства памяти в стеке.

Вы всегда можете попробовать и посмотреть на auto ключевое слово в C++ 11 и C++ 14, но до этого убедитесь, что вы знаете, что тип (например, была разница между 1, 1.0 и 1.f)

Смежные вопросы