Являются ли необъявленные переменные допустимыми в C ++?

0

Я полностью озадачен кодом, который я пытаюсь скомпилировать. Компилятор дает мне несколько десятков ошибок "необъявленного идентификатора". Все они кажутся локальными переменными цикла, такими как:

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 сначала объявляется и используется в строке 1784, а затем повторно используется после тела этого цикла.
  • 0
    @IgorTandetnik - Я думаю, что вы только что нашли его ... код был изначально скомпилирован с VC7 (не уверен, какая Visual Studio сейчас). Я надеялся, что VS2013 тоже сможет скомпилироваться.
Показать ещё 3 комментария
Теги:
visual-c++

2 ответа

5
Лучший ответ

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

Чтобы скомпилировать такой код с MSVC, добавьте компилятор switch/Ze

Подробнее см. В документах MSDN.

В комментарии ниже предлагается /Zc: forScope, но в соответствии с этой страницей MSDN это неправильно.

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

  • 0
    Невероятно! Это оно ! for (int iK...) в строке 1784 примера (в комментариях к вопросу) определяет iK и эта переменная остается затем определенной до конца включения, которое начинается в 1783 году и заканчивается в 1842 году.
  • 0
    И для записей, G ++ имеет -fno-for-scope для той же цели. В руководстве они ссылаются на «код старого стиля». На самом деле это очень старый стиль, поскольку Stroustrup в издании "Язык программирования C ++" от 2000 года уже объясняет, что переменная не видна после окончания for.
Показать ещё 1 комментарий
0

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню