Разрешить использование переменной в локальной области

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

Как я могу сказать VStudio разрешить это?

for (CBookmarks::iterator it = m_listBookmarks.begin();
    !(it==m_listBookmarks.end()) && hSelected!=it->hParent;
    it++);

CString Hierarchy = LookupHierarchy(it->hParent);

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

Изменить

По какой-то причине я все еще получаю ошибки компиляции, несмотря на настройку:

введите здесь описание изображения

Я попытался изменить https://msdn.microsoft.com/en-us/library/84wcsx8x.aspx?f=255&MSPPError=-2147217396, но я все еще получаю ошибки компиляции.


person jgauffin    schedule 04.06.2015    source источник
comment
it++); уберите лишнюю точку с запятой   -  person Borgleader    schedule 04.06.2015
comment
@Borgleader: это приведет к нежелательному поведению. Это устаревший код, который отлично работает. Я просто хочу сказать vstudio, чтобы разрешить использование переменной вне области for. (я не поддерживаю приложение, просто читаю/запускаю его как ссылку для нового проекта)   -  person jgauffin    schedule 04.06.2015
comment
Я знаю, вы сказали, что не можете/не хотите изменять код, но почему бы не использовать одно регулярное выражение для исправления всех циклов for во всей кодовой базе, а затем перекомпилировать. Не должно занимать так много времени, как ожидание другого ответа.   -  person Avi Ginsburg    schedule 04.06.2015


Ответы (1)


Использовать:

/Zc:forScope-

Как задокументировано: https://msdn.microsoft.com/en-us/library/84wcsx8x.aspx

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

CBookmarks::iterator it = m_listBookmarks.begin();
for (;
    !(it==m_listBookmarks.end()) && hSelected!=it->hParent;
    it++);

CString Hierarchy = LookupHierarchy(it->hParent);

Важно После активации параметра необходимо удалить предварительно скомпилированный файл кэша заголовков (*.pch), так как в противном случае он не действует.

person tenfour    schedule 04.06.2015
comment
такое же поведение используется во многих местах. Они используют старую версию VStudio, которая не дает ошибок компиляции. Я не могу изменить все. - person jgauffin; 04.06.2015
comment
Взял на себя смелость немного обновить ваш ответ частью, которую я пропустил. - person jgauffin; 04.06.2015
comment
@tenfour -Но я действительно ненавижу идею использования такого переключателя. - если нельзя, но очень хочется, то можно - это (скрытая) идея C++. Неправильно применено - это УБ. - person SChepurin; 04.06.2015
comment
Что такое УБ? В стандартном C++ это ошибка, а не UB. С /Zc:forScope- это не ошибка и не UB. - person tenfour; 04.06.2015
comment
Ирония в том, что если не можешь, но очень хочешь,... - это УБ применяется неправильно. Забудь это... - person SChepurin; 04.06.2015