Есть ли способ отключить только одну строку предупреждения в файле cpp с помощью Visual Studio?
Например, если я поймаю исключение и не обрабатываю его, я получаю ошибку 4101 (локальная переменная без ссылки). Есть ли способ игнорировать это только в этой функции, но в противном случае сообщить об этом в модуле компиляции? На данный момент я помещаю его #pragma warning (disable : 4101)
в начало файла, но это, очевидно, просто отключает его для всего устройства.
c++
visual-c++
warnings
pragma
Cookie-файлы
источник
источник
catch (const std::exception& /* unnamed */) {.... }
. Он не отвечает на ваш вопрос, но может решить вашу проблему.Ответы:
источник
clang
кажется, не поддерживают эту прагму, но вы можете достичь того же эффекта#pragma clang diagnostic push
,#pragma clang diagnostic ignored "-Wunused-variable"
и#pragma clang diagnostic pop
. См. «Управление диагностикой с помощью прагм» в руководстве пользователя Clang/wd4101
. Обратите внимание, что:
между флагом и числом нет нормального значения , и вы не можете составить список чисел, разделенных запятыми. Для других компиляторов это может быть/nowarn:4101
вместо этого.Если вы хотите подавить предупреждение только в одной строке кода, вы можете использовать
suppress
спецификатор предупреждения :Для одной строки кода это работает так же, как написание следующего:
источник
suppress
спецификатор работает с одной предварительно обработанной строкой кода. Если следующая строка#pragma warning(suppress: ...)
является#include
директивой (которая расширяет файл, на который ссылается его параметр, в текущую единицу компиляции), эффект применяется только к первой строке этого файла. Это должно быть очевидно, поскольку предупреждения генерируются компилятором. Компилятор работает с предварительно обработанным кодом.#pragma
push / pop часто являются решением такого рода проблем, но в этом случае почему бы вам просто не удалить переменную, на которую нет ссылки?источник
:P
).Используйте
#pragma warning ( push )
, затем#pragma warning ( disable )
, затем поместить свой код, а затем использовать ,#pragma warning ( pop )
как описано здесь :источник
Пример:
Эта прагма действительна для C ++, начиная с Visual Studio 2005.
https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx
Прагма НЕ действительна для C # через Visual Studio 2005 через Visual Studio 2015.
Ошибка: «Ожидается отключение или восстановление».
(Я думаю, они так и не добрались до реализации
suppress
...)https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140).aspx
C # нужен другой формат. Это выглядело бы так (но не работает):
Вместо этого
suppress
вам нужноdisable
иenable
:Это ТАК некрасиво, я думаю, что разумнее просто изменить его стиль:
источник
Вместо того, чтобы помещать его поверх файла (или даже файла заголовка), просто оберните код, о котором идет речь
#pragma warning (push)
,#pragma warning (disable)
и сопоставление#pragma warning (pop)
, как показано здесь .Хотя есть и другие варианты, в том числе
#pramga warning (once)
.источник
Также можно использовать
UNREFERENCED_PARAMETER
определенные вWinNT.H
. Определение просто:И используйте это так:
Вы можете возразить, что вы можете просто опустить само имя переменной. Ну, есть случаи (другая конфигурация проекта, сборки Debug / Release), когда переменная действительно может использоваться. В другой конфигурации эта переменная не используется (отсюда и предупреждение).
Некоторый статический анализ кода может по-прежнему выдавать предупреждение для этого бессмысленного утверждения (
wParam;
). В этом случае вы можете использовать тоDBG_UNREFERENCED_PARAMETER
же самое, что иUNREFERENCED_PARAMETER
в отладочных сборках, иP=P
в сборке выпуска.источник
[[maybe_unused]]
атрибутЕсли вы хотите отключить
unreferenced local variable
запись в каком-то заголовкеи использовать
источник
(void)unusedVar;
?(void)unusedVar;?
он не соответствует стандарту C ++.static_cast<void>(unusedVar)
.Any expression can be explicitly converted to type “cv void.” The expression value is discarded
что можно писатьstatic_cast<void>(unusedVar)
иstatic_cast<const void>(unusedVar)
иstatic_cast<volatile void>(unusedVar)
. Все формы действительны. Надеюсь, это проясняет ваши сомнения.В определенных ситуациях у вас должен быть именованный параметр, но вы не используете его напрямую.
Например, я столкнулся с этим на VS2010, когда 'e' используется только внутри
decltype
оператора, компилятор жалуется, но у вас должна быть указанная переменнаяe
.Все вышеперечисленные невнесения
#pragma
сводятся к простому добавлению одного оператора:источник
как упоминал @rampion, если вы находитесь в clang gcc, предупреждения указываются по имени, а не по номеру, и вам нужно будет сделать:
эта информация взята отсюда
источник