Отключить одно предупреждение

Есть ли способ отключить только одну строку предупреждения в файле cpp с визуальной студией?

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

Ответ 1

#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop ) 

Ответ 2

Если вы хотите только подавить предупреждение в одной строке кода, вы можете использовать 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)

Ответ 3

#pragma push/pop часто являются решением для подобных проблем, но в этом случае почему бы вам просто не удалить переменную без ссылок?

try
{
    // ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
    // ...
}

Ответ 4

Используйте #pragma warning ( push ), затем #pragma warning ( disable ), затем поместите свой код, затем используйте #pragma warning ( pop ), как описано здесь:

#pragma warning( push )
#pragma warning( disable : WarningCode)
// code with warning
#pragma warning( pop ) 

Ответ 5

Вместо того, чтобы помещать его поверх файла (или даже заголовочного файла), просто оберните соответствующий код с помощью #pragma warning (push), #pragma warning (disable) и соответствующего #pragma warning (pop), как показано здесь.

Хотя есть и другие опции, включая #pramga warning (once).

Ответ 6

Можно также использовать 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)

Ответ 7

В определенных ситуациях у вас должен быть именованный параметр, но вы не используете его напрямую.
Например, я столкнулся с ним на VS2010, когда 'e' используется только внутри оператора decltype, компилятор жалуется, но вы должны иметь именованный вариант e.

Все приведенные выше предложения #pragma все сводятся к простому добавлению одного оператора:

bool f(int e)
{ 
   // code not using e
   return true;
   e; // use without doing anything
}

Ответ 8

Если вы хотите отключить unreferenced local variable запись в некотором заголовке

template<class T>
void ignore (const T & ) {}

и используйте

catch(const Except & excpt) {
    ignore(excpt); // No warning
    // ...  
} 

Ответ 9

Пример:

#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