Отключить одно предупреждение об ошибке - PullRequest
93 голосов
/ 23 августа 2011

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

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

Ответы [ 10 ]

154 голосов
/ 23 августа 2011
#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop ) 
71 голосов
/ 22 августа 2014

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

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

try
{
    // ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
    // ...
}
9 голосов
/ 23 августа 2011

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

#pragma warning( push )
#pragma warning( disable : WarningCode)
// code with warning
#pragma warning( pop ) 
4 голосов
/ 23 августа 2011

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

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

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

3 голосов
/ 26 июня 2016

Пример:

#pragma warning(suppress:0000)  // (suppress one error in the next line)

Эта прагма действительна для 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 # нужен другой формат. Это будет выглядеть так (но не работает):

#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
2 голосов
/ 18 октября 2018

как упомянуто @rampion, если вы находитесь в clang gcc, предупреждения по имени, а не по номеру, и вам нужно будет сделать:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
// ..your code..
#pragma clang diagnostic pop

эта информация взята с здесь

2 голосов
/ 07 августа 2014

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

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

bool f(int e)
{ 
   // code not using e
   return true;
   e; // use without doing anything
}
1 голос
/ 23 августа 2011

Если вы хотите отключить unreferenced local variable, напишите в какой-нибудь заголовок

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

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

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