Я полностью озадачен кодом, который я пытаюсь скомпилировать. Компилятор дает мне несколько десятков ошибок "необъявленного идентификатора". Все они кажутся локальными переменными цикла, такими как:
for ( i = 0; i < 100; i++ )
Я мог бы легко исправить это, но я не понимаю, как этот код мог быть скомпилирован для других людей. И эти файлы не были затронуты в возрасте.
Есть ли какой-то флаг компилятора для VC++, который автоматически принимает int
для необъявленных переменных? Я не мог найти его. Что дает?
Минимальный полный пример кода, который реплицирует проблему:
for ( int i = 0; i < 100; i++ );
for ( i = 0; i < 100; i++ );
Вопрос связан с объемом переменных, объявленных в инструкции for
. Стандарт определяет, что эта область должна быть ограничена самим циклом for
. Но некоторые компиляторы поддерживают нестандартные устаревшие расширения, которые использовались для расширения этой области до охватывающего блока.
Чтобы скомпилировать такой код с MSVC, добавьте компилятор switch/Ze
Подробнее см. В документах MSDN.
В комментарии ниже предлагается /Zc: forScope, но в соответствии с этой страницей MSDN это неправильно.
Кстати, G++ имеет аналогичный -fno-for-scope
.
for (int iK...)
в строке 1784 примера (в комментариях к вопросу) определяет iK
и эта переменная остается затем определенной до конца включения, которое начинается в 1783 году и заканчивается в 1842 году.
-fno-for-scope
для той же цели. В руководстве они ссылаются на «код старого стиля». На самом деле это очень старый стиль, поскольку Stroustrup в издании "Язык программирования C ++" от 2000 года уже объясняет, что переменная не видна после окончания for.
C++ - типизированный язык. Одна из причин заключается в том, что вы должны объявлять переменные перед их использованием.
Это кажется странным для многих, но это способствует хорошей практике кодирования, так же, как и к ошибкам, когда вы делаете опечатки в именах переменных.
По понятным причинам, это помогает вам назвать хорошую версию перегруженной функции, проверяя тип аргументов. Эта проверка может быть выполнена во время компиляции, что повышает производительность во время выполнения.
Это наследуется от C, который является choser для сборки, тогда C++. Выделение переменных означает выделение пространства памяти в стеке.
Вы всегда можете попробовать и посмотреть ключевое слово auto
в C++ 11 и C++ 14, но перед этим убедитесь, что знаете, что такое тип (например, была разница между 1
, 1.0
и 1.f
)
for (int i = 0; i < 10; ++i) {...} i = 42;
В этом файле, который вы цитируете, переменнаяiK
сначала объявляется и используется в строке 1784, а затем повторно используется после тела этого цикла.