web-dev-qa-db-fra.com

Comment supprimer les avertissements dans les en-têtes externes dans Visual C ++

Je démarre un nouveau projet BREW, et j'aimerais compiler avec Warning Level 4 (/ W4) pour garder le code d'application Nice et propre. Le problème est que les en-têtes BREW eux-mêmes ne se compilent pas correctement avec/W4.

Dans gcc, vous pouvez faire la différence entre les en-têtes d'application et les en-têtes système en utilisant -I et -isystem, puis par défaut, gcc ne signale aucun avertissement de compilation dans les en-têtes système. Existe-t-il un mécanisme équivalent dans Visual C++?

56
Bob Whiteman

Utilisez cette méthode uniquement autour d'un bloc d'en-têtes que vous ne pouvez pas modifier, mais que vous devez inclure.

Vous pouvez sélectivement et temporairement désactiver tous les avertissements comme celui-ci:

#pragma warning(Push, 0)        
//Some includes with unfixable warnings
#pragma warning(pop)

Au lieu de 0, vous pouvez éventuellement passer le numéro d'avertissement à désactiver, donc quelque chose comme:

#pragma warning( Push )
#pragma warning( disable : 4081)
#pragma warning( disable : 4706 )
// Some code
#pragma warning( pop ) 
79
Brian R. Bondy

L'équipe Visual C++ vient d'ajouter la prise en charge des niveaux d'avertissement dans les en-têtes externes. Vous pouvez trouver les détails dans leur article de blog: Théorie des avertissements brisés .

En substance, il fait automatiquement ce que les suggestions recommandaient ici de faire manuellement: pousse le nouveau niveau d'avertissement juste avant la directive #include et le fait apparaître juste après. Il existe des indicateurs supplémentaires pour spécifier les emplacements des en-têtes externes, un indicateur pour traiter tous les <> comme externes, #pragma system_header et une fonctionnalité non disponible dans Clang ou GCC (au moment d'écrire ces lignes) pour voir les avertissements dans les en-têtes externes à travers la pile d'instanciation de modèle lorsque le modèle a été instancié dans le code utilisateur.

Outre les commentaires sous ce post, vous pouvez également trouver des discussions utiles dans ne annonce reddit pour ce post .

11
solodon

Je ne pense pas que Visual C++ vous permette de vous différencier. Vous pouvez le simuler en utilisant #pragma warning autour de l'inclusion:

#pragma warning(Push, 0)
#include "mywarningheader.h"
#pragma warning(pop)
4
Dan Story