web-dev-qa-db-fra.com

Désactiver l'erreur d'avertissement unique

Existe-t-il un moyen de désactiver une seule ligne d'avertissement dans un fichier cpp avec Visual Studio?

Par exemple, si j'attrape une exception et que je ne la gère pas, j'obtiens l'erreur 4101 (variable locale non référencée). Existe-t-il un moyen d'ignorer cela uniquement dans cette fonction, mais sinon, le signaler dans l'unité de compilation? Pour le moment, je mets #pragma warning (disable : 4101) en haut du fichier, mais cela le désactive évidemment pour l'ensemble de l'unité.

94
Cookie
#pragma warning( Push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop ) 
158
Andreas Brinck

Si vous souhaitez uniquement supprimer un avertissement dans une seule ligne de code, vous pouvez utiliser le suppressspécificateur d'avertissement :

#pragma warning(suppress: 4101)
// here goes your single line of code where the warning occurs

Pour une seule ligne de code, cela fonctionne de la même manière que d'écrire ce qui suit:

#pragma warning(Push)
#pragma warning(disable: 4101)
// here goes your code where the warning occurs
#pragma warning(pop)
72
Daniel Seither

#pragma Push/pop sont souvent une solution à ce type de problèmes, mais dans ce cas, pourquoi ne supprimez-vous pas simplement la variable non référencée?

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

Utilisez #pragma warning ( Push ), puis #pragma warning ( disable ), puis mettez votre code, puis utilisez #pragma warning ( pop ) comme décrit ici :

#pragma warning( Push )
#pragma warning( disable : WarningCode)
// code with warning
#pragma warning( pop ) 
9
sharptooth

Au lieu de le placer au-dessus du fichier (ou même d'un fichier d'en-tête), enveloppez simplement le code en question avec #pragma warning (Push), #pragma warning (disable) et une correspondance #pragma warning (pop), comme indiqué ici .

Bien qu'il existe d'autres options, notamment #pramga warning (once).

4
Christian.K

On peut aussi utiliser UNREFERENCED_PARAMETER défini dans WinNT.H. La définition est juste:

#define UNREFERENCED_PARAMETER(P)          (P)

Et utilisez-le comme:

void OnMessage(WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(wParam);
    UNREFERENCED_PARAMETER(lParam);
}

Pourquoi voudriez-vous l'utiliser, vous pourriez dire que vous pouvez simplement omettre le nom de la variable elle-même. Eh bien, il existe des cas (configuration de projet différente, versions Debug/Release) dans lesquels la variable peut être réellement utilisée. Dans une autre configuration, cette variable est inutilisée (et donc l’avertissement).

Certaines analyses de code statiques peuvent toujours donner un avertissement pour cette instruction non-sensée (wParam;). Dans ce cas, vous pouvez utiliser DBG_UNREFERENCED_PARAMETER qui est identique à UNREFERENCED_PARAMETER dans les versions de débogage et P=P dans la version release.

#define DBG_UNREFERENCED_PARAMETER(P)      (P) = (P)
4
Ajay

Exemple:

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

Ce pragma est valable pour C++ à partir de Visual Studio 2005.
https://msdn.Microsoft.com/en-us/library/2c8f766e (v = vs.80) .aspx

Le pragma n'est PAS valable pour C # à travers Visual Studio 2005 à Visual Studio 2015.
Erreur: "Désactivation ou restauration attendue".
(Je suppose qu'ils n'ont jamais mis en œuvre suppress ...)
https://msdn.Microsoft.com/en-us/library/441722ys (v = vs.140) .aspx

C # a besoin d'un format différent. Cela ressemblerait à ceci (mais ne fonctionnerait pas):

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

Au lieu de suppress, vous devez disable et enable:

if (condition)
#pragma warning disable 0642
    ;  // Empty statement HERE provokes Warning: "Possible mistaken empty statement" (CS0642)
#pragma warning restore 0642
else

C’est SO moche, je pense qu’il est plus judicieux de la reformuler:

if (condition)
{
    // Do nothing (because blah blah blah).
}
else
3
A876

Dans certaines situations vous devez avez un paramètre nommé mais vous ne l'utilisez pas directement.
Par exemple, je l'ai rencontré sur VS2010, lorsque "e" est utilisé uniquement dans une instruction decltype, le compilateur se plaint mais vous devez disposer de la varible nommée e.

Tout ce qui précède non -#pragma suggestions, tout se résume à l’ajout d’une seule déclaration:

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

comme @rampion l'a mentionné, si vous êtes dans Clang Gcc, les avertissements sont par nom, pas par nombre, et vous devrez procéder comme suit:

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

cette information vient de ici

2
orion elenzil

Si vous voulez désactiver unreferenced local variable écrire dans un en-tête

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

et utilise

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