web-dev-qa-db-fra.com

Comment désactiver les avertissements pour des fichiers include particuliers?

Je souhaite désactiver des avertissements particuliers pour tous les fichiers inclus, directement ou indirectement, par des fichiers d'inclusion particuliers. Par exemple, je souhaite désactiver l'avertissement "vous affectez un littéral de chaîne à un caractère *", pour tous les fichiers ou les fichiers inclus par les fichiers inclus par un #include <bar/*> (l'étoile dans mon cas signifie "tout peut être ici").

La raison en est que certaines des personnes avec qui je dois programmer ne peuvent tout simplement pas utiliser "const", donc à la fin, je reçois beaucoup d'avertissements concernant cet abus de littéral particulier. Je voudrais ignorer ces milliers d'avertissements provenant de leur code, donc je peux me concentrer sur les erreurs dans mon propre code et les corriger.

J'utilise Intel C++ et GCC. Certains de mes copains utilisent clang, donc je serais heureux d'entendre des solutions pour cela aussi.

67

Lorsque vous utilisez GCC, vous pouvez utiliser le -isystem drapeau au lieu de -I flag pour désactiver les avertissements de cet emplacement.

Donc, si vous utilisez actuellement

gcc -Iparent/path/of/bar …

utilisation

gcc -isystem parent/path/of/bar …

au lieu. Malheureusement, ce n'est pas un contrôle particulièrement fin. Je ne connais pas de mécanisme plus ciblé.

66
Konrad Rudolph

Une meilleure solution GCC: utilisez #pragma.

#pragma GCC diagnostic Push 
#pragma GCC diagnostic ignored "-W<evil-option>"
#include <evil_file>
#pragma GCC diagnostic pop

par exemple:

#pragma GCC diagnostic Push 
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include <QtXmlPatterns>
#pragma GCC diagnostic pop
34
Brad

Lorsque j'utilise g++ et j'ai des en-têtes tiers qui génèrent des tonnes d'avertissements avec mes valeurs par défaut habituelles de -Wall -Wextra & co. J'ai tendance à les regrouper dans des inclusions distinctes, en précisant les system_header#pragma.

[...] GCC donne au code trouvé dans les en-têtes système un traitement spécial. Tous les avertissements, autres que ceux générés par #warning (voir Diagnostics), sont supprimés pendant que GCC traite un en-tête système. Les macros définies dans un en-tête système sont à l'abri de quelques avertissements où qu'elles soient développées. Cette immunité est accordée sur une base ad hoc, lorsque nous constatons qu'un avertissement génère beaucoup de faux positifs en raison du code dans les macros définies dans les en-têtes du système.

[...]

Il existe également une directive, #pragma GCC system_header, qui indique à GCC de considérer le reste du fichier include actuel comme un en-tête système, peu importe où il a été trouvé. Code précédant le #pragma dans le fichier ne sera pas affecté. #pragma GCC system_header n'a aucun effet dans le fichier source principal.

Je préfère cette solution au -isystem un parce qu'il est plus fin et je peux le mettre directement dans les sources, sans trop gâcher les arguments de la ligne de commande et inclure des répertoires.

Exemple avec la hideuse bibliothèque racine:

#ifndef ROOTHEADERS_HPP_INCLUDED
#define ROOTHEADERS_HPP_INCLUDED
#ifdef __GNUC__
// Avoid tons of warnings with root code
#pragma GCC system_header
#endif
#include "TH1F.h"
#include "TApplication.h"
#include "TGraph.h"
#include "TGraph2D.h"
#include "TCanvas.h"
#endif
31
Matteo Italia

Je suppose que la solution la plus simple serait d'écrire un script simple qui appellera le compilateur, compilera et supprimera la sortie indésirable, en fonction du nom de fichier et du type d'avertissement. Vous pouvez utiliser différents scripts pour chaque compilateur.

Mettez simplement à jour votre makefile pour utiliser ce script au lieu d'appeler directement le compilateur.

0
Gilad Naor