VS2013 игнорирует предупреждение прагмы об отключении

int main() {
#pragma warning(push)
#pragma warning(disable: 4101)
    int i;
#pragma warning(pop)
}

########################### ИЛИ #################### ########

int main() {
#pragma warning(suppress: 4101)
    int i;
}

Я считаю, что любой из них должен компилироваться в Visual Studio 2013 с предупреждениями, рассматриваемыми как ошибки, без предупреждения C4101 (о том, что I является локальной переменной без ссылки). Это предупреждение уровня 4.

Но, это все еще дает мне предупреждение. Даже если я отключу предупреждения, рассматриваемые как ошибки, он все равно выдает мне предупреждение, хотя затем компилируется, потому что ошибки нет.

Я не использую предварительно скомпилированные заголовки /stdafx.h. Я видел некоторые другие вопросы, в которых говорилось, что этот метод прагмы будет работать с реальным кодом (возможно, они имели в виду код в заголовках, но не указывали или не выглядели так). Некоторые другие расплывчато говорят без объяснения причин, что любые команды #pragma до stdafx.h будут игнорироваться. Но 'https://msdn.microsoft.com/en-us/library/d9x1s805(v=vs.120).aspx' специально упоминает прагму, которая может быть в исходном коде для переопределения параметров компилятора. Конечно, я никогда не пользовался stdafx.h, будучи скорее парнем из Unix, так что, возможно, есть что-то совершенно фундаментальное, чего мне совершенно не хватает.

Я пытался указать C4101 вместо 4101, и он не может обрабатывать там альфу. Я попытался указать предупреждение #pragma (push 2), хотя это приведет к попаданию всех предупреждений уровня 3 и 4, которые я не хочу делать, и даже это по-прежнему дает предупреждение уровня 4.

Вот мои параметры командной строки компилятора: /MP /GS /W4 /Zc:wchar_t /Zi /Gm- /Od /sdl /Fd"<...>\pragmaWarning\Intermediate\vc120.pdb" /fp:precise /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /Fa"<...>\pragmaWarning\Intermediate\" /EHsc /nologo /Fo"<...>\pragmaWarning\Intermediate\" /Fp"<...>\pragmaWarning\Intermediate\pragmaWarning.pch"

Как видите, эти параметры командной строки пропускают предупреждения, рассматриваемые как ошибки.


person user1902689    schedule 09.04.2015    source источник
comment
Эта прагма предупреждения может распространяться на всю функцию, то есть она применяется к последующим функциям, а не к объявлениям. Может быть.   -  person Mooing Duck    schedule 09.04.2015
comment
Весь этот stdafx не имеет отношения к вашей проблеме, не беспокойтесь об этом.   -  person Mooing Duck    schedule 09.04.2015
comment
И да, я мог бы удалить локальную переменную без ссылки. И, да, я мог бы иметь строку: i; Или используйте макрос unused_variable, который делает то же самое. И да, я мог бы отключить конкретное предупреждение для всего проекта. Но я больше ищу исправление для тех редких и немногих ситуаций, когда вы явно хотите отключить предупреждение для определенной строки (строк), но включить его для всего остального.   -  person user1902689    schedule 09.04.2015
comment
Некоторые предупреждения относятся к функции, а не к строке кода, C4101 — одно из них. Вам нужно отключить его вне области действия функции. Обратите внимание, что подавление применяется только к следующей физической строке в файле.   -  person Chuck Walbourn    schedule 09.04.2015
comment
Чак понял! Если я нажму и отключу перед функцией и вытолкнуть после функции, она работает нормально. И использование только подавления не работает, как будто вы говорите только следующую физическую строку. Как узнать, относится ли предупреждение к функции, строке кода или чему-то еще? 'msdn.microsoft.com/en-us/library/c733d5h9.aspx' (в документации по VS2013 C4101) не указано.   -  person user1902689    schedule 09.04.2015
comment
Согласно ссылке из FoggyDay ниже в документации Microsoft говорится, что использование прагмы предупреждения в функции для изменения состояния предупреждения с числом больше 4699 вступит в силу только после завершения функции. См. msdn.microsoft.com/en-us/library/2c8f766e.aspx   -  person Richard Chambers    schedule 09.04.2015
comment
@ChuckWalbourn: Физический? лол.... лексический?   -  person Lightness Races in Orbit    schedule 09.04.2015
comment
@ChuckWalbourn: Пожалуйста, пишите ответы как ответы, а не комментарии. Это вопрос-ответ, а не чат! Ваше здоровье   -  person Lightness Races in Orbit    schedule 09.04.2015


Ответы (2)


Некоторые предупреждения относятся к области действия функции и не могут быть подавлены с помощью #pragma warning(suppress: 4101). Их также, как вы заметили, нельзя отключить, просто сделав это вокруг определенной строки. Вы должны отключить это предупреждение для всей функции:

#pragma warning(push)
#pragma warning(disable: 4101)
int main() {
    int i;
}
#pragma warning(pop)

Также обратите внимание, что для предупреждений, относящихся к строке, а не к области действия, использование #pragma warning(suppress: xxx) относится к следующей фактической строке в файле.

person Chuck Walbourn    schedule 09.04.2015

Я согласен, #pragma warning(suppress: 4101) должен это сделать.

В: Почему бы не попробовать #pragma warning(disable: 4101)?

Or

#pragma warning(push)
#pragma warning(disable: 4101)
    int i;
    ... more code ...
#pragma warning(pop)

Вот документация Microsoft:

https://msdn.microsoft.com/en-us/library/2c8f766e.aspx

person FoggyDay    schedule 09.04.2015
comment
Извините, у меня было два блока кода в моем исходном посте, который я пробовал, и, вероятно, я мог бы лучше их разделить. Я пойду сделаю разделение более четким. Один из них идентичен этому, но по-прежнему вызывает предупреждение. - person user1902689; 09.04.2015