Ответ 1
#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop )
Есть ли способ отключить только одну строку предупреждения в файле cpp с визуальной студией?
Например, если я поймаю исключение и не обрабатываю его, я получаю ошибку 4101 (локальная переменная без ссылок). Есть ли способ игнорировать это только в этой функции, но в противном случае сообщить об этом в блок компиляции? На данный момент я помещаю #pragma warning (disable : 4101)
в начало файла, но это явно просто отключает его для всего блока.
#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop )
Если вы хотите только подавить предупреждение в одной строке кода, вы можете использовать suppress
спецификатор предупреждений:
#pragma warning(suppress: 4101)
// here goes your single line of code where the warning occurs
Для одной строки кода это работает так же, как написано следующее:
#pragma warning(push)
#pragma warning(disable: 4101)
// here goes your code where the warning occurs
#pragma warning(pop)
#pragma
push/pop часто являются решением для подобных проблем, но в этом случае почему бы вам просто не удалить переменную без ссылок?
try
{
// ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
// ...
}
Используйте #pragma warning ( push )
, затем #pragma warning ( disable )
, затем поместите свой код, затем используйте #pragma warning ( pop )
, как описано здесь:
#pragma warning( push )
#pragma warning( disable : WarningCode)
// code with warning
#pragma warning( pop )
Вместо того, чтобы помещать его поверх файла (или даже заголовочного файла), просто оберните соответствующий код с помощью #pragma warning (push)
, #pragma warning (disable)
и соответствующего #pragma warning (pop)
, как показано здесь.
Хотя есть и другие опции, включая #pramga warning (once)
.
Можно также использовать UNREFERENCED_PARAMETER
, определенный в WinNT.H
. Определение справедливо:
#define UNREFERENCED_PARAMETER(P) (P)
И используйте его как:
void OnMessage(WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(lParam);
}
Зачем вы его используете, вы можете утверждать, что вы можете просто опустить имя переменной. Ну, есть случаи (другая конфигурация проекта, сборка Debug/Release), где фактически можно использовать переменную. В другой конфигурации эта переменная не используется (и, следовательно, предупреждение).
Некоторые статические анализы кода могут все еще давать предупреждение для этого не несущественного утверждения (wParam;
). В этом случае вы можете использовать DBG_UNREFERENCED_PARAMETER
, который аналогичен UNREFERENCED_PARAMETER
в отладочных сборках, и делает P=P
в сборке релиза.
#define DBG_UNREFERENCED_PARAMETER(P) (P) = (P)
В определенных ситуациях у вас должен быть именованный параметр, но вы не используете его напрямую.
Например, я столкнулся с ним на VS2010, когда 'e' используется только внутри оператора decltype
, компилятор жалуется, но вы должны иметь именованный вариант e
.
Все приведенные выше предложения #pragma
все сводятся к простому добавлению одного оператора:
bool f(int e)
{
// code not using e
return true;
e; // use without doing anything
}
Если вы хотите отключить unreferenced local variable
запись в некотором заголовке
template<class T>
void ignore (const T & ) {}
и используйте
catch(const Except & excpt) {
ignore(excpt); // No warning
// ...
}
Пример:
#pragma warning(suppress:0000) // (suppress one error in the next line)
Эта прагма действительна для С++, начиная с Visual Studio 2005.
https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx
Прага не действует для С# через Visual Studio 2005 через Visual Studio 2015.
Ошибка: "Ожидаемое отключение или восстановление".
(Я думаю, они никогда не добрались до реализации suppress
...)
https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140).aspx
С# нужен другой формат. Это будет выглядеть так (но не работает):
#pragma warning suppress 0642 // (suppress one error in the next line)
Вместо suppress
вам нужно disable
и enable
:
if (condition)
#pragma warning disable 0642
; // Empty statement HERE provokes Warning: "Possible mistaken empty statement" (CS0642)
#pragma warning restore 0642
else
Это так безобразно, я думаю, что умнее просто перестроить его:
if (condition)
{
// Do nothing (because blah blah blah).
}
else