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 de le signaler dans l'unité de compilation? Pour le moment, je mets #pragma warning (disable : 4101)
en haut du fichier, mais cela l'éteint évidemment pour l'ensemble de l'unité.
c++
visual-c++
warnings
pragma
Biscuit
la source
la source
catch (const std::exception& /* unnamed */) {.... }
. Cela ne répond pas à votre question, mais pourrait résoudre votre problème.Réponses:
la source
clang
ne semble pas soutenir cette pragma, mais vous pouvez obtenir le même effet avec#pragma clang diagnostic push
,#pragma clang diagnostic ignored "-Wunused-variable"
et#pragma clang diagnostic pop
. Voir "Contrôle des diagnostics via Pragmas" dans le manuel de l'utilisateur Clang/wd4101
. Notez qu'il n'y a pas la normale:
entre l'indicateur et le nombre, et vous ne pouvez pas faire une liste de nombres séparés par des virgules. Pour les autres compilateurs, cela pourrait être à la/nowarn:4101
place.Si vous ne souhaitez supprimer un avertissement que sur une seule ligne de code, vous pouvez utiliser le
suppress
spécificateur d'avertissement :Pour une seule ligne de code, cela fonctionne de la même manière que l'écriture de ce qui suit:
la source
suppress
spécificateur fonctionne sur une seule ligne de code pré-traitée . Si la ligne qui suit#pragma warning(suppress: ...)
est une#include
directive (qui étend le fichier référencé par son paramètre dans l'unité de compilation actuelle), l'effet s'applique uniquement à la première ligne de ce fichier. Cela devrait être évident, car les avertissements sont générés par le compilateur. Le compilateur fonctionne sur du code pré-traité.#pragma
push / pop sont souvent une solution à ce genre de problèmes, mais dans ce cas, pourquoi ne supprimez-vous pas simplement la variable non référencée?la source
:P
).Utilisez
#pragma warning ( push )
, puis#pragma warning ( disable )
, puis mettez votre code, puis utilisez#pragma warning ( pop )
comme décrit ici :la source
Exemple:
Ce pragma est valide pour C ++ à partir de Visual Studio 2005.
https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx
Le pragma n'est PAS valide pour C # via Visual Studio 2005 via Visual Studio 2015.
Erreur: «Désactivation ou restauration attendue».
(Je suppose qu'ils n'ont jamais réussi à mettre 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):
Au lieu de
suppress
, vous devezdisable
etenable
:C'est tellement moche, je pense qu'il est plus intelligent de simplement le remodeler:
la source
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)
.la source
On peut également utiliser
UNREFERENCED_PARAMETER
défini dansWinNT.H
. La définition est juste:Et utilisez-le comme:
Pourquoi l'utiliseriez-vous, vous pourriez dire que vous pouvez simplement omettre le nom de la variable lui-même. Eh bien, il y a des cas (configuration de projet différente, versions Debug / Release) où la variable peut être utilisée. Dans une autre configuration, cette variable reste inutilisée (et donc l'avertissement).
Certaines analyses de code statique peuvent toujours donner un avertissement pour cette instruction non-absurde (
wParam;
). Dans ce cas, vous pouvez utiliserDBG_UNREFERENCED_PARAMETER
ce qui est le même queUNREFERENCED_PARAMETER
dans les versions de débogage et qui le faitP=P
dans la version de version.la source
[[maybe_unused]]
attributSi vous souhaitez désactiver l'
unreferenced local variable
écriture dans un en-têteet utilise
la source
(void)unusedVar;
:?(void)unusedVar;?
n'est pas conforme à la norme C ++.static_cast<void>(unusedVar)
.Any expression can be explicitly converted to type “cv void.” The expression value is discarded
selon lequel vous pouvez écrirestatic_cast<void>(unusedVar)
etstatic_cast<const void>(unusedVar)
etstatic_cast<volatile void>(unusedVar)
. Tous les formulaires sont valides. J'espère que cela clarifie votre doute.Dans certaines situations, vous devez avoir 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
decltype
instruction, le compilateur se plaint mais vous devez avoir la variable nomméee
.Toutes les non-
#pragma
suggestions ci-dessus se résument toutes à l'ajout d'une seule déclaration:la source
comme @rampion l'a mentionné, si vous êtes dans clang gcc, les avertissements sont par nom, pas par numéro, et vous devrez faire:
cette information vient d' ici
la source