Existe-t-il un moyen de supprimer les avertissements dans Xcode?

119

Existe-t-il un moyen de supprimer les avertissements dans Xcode?

Par exemple, j'appelle une méthode non documentée et comme la méthode n'est pas dans l'en-tête, je reçois un avertissement lors de la compilation. Je sais que je peux l'ajouter à mon en-tête pour arrêter l'avertissement, mais je me demande s'il existe un autre moyen que de l'ajouter à l'en-tête (afin que je puisse garder les en-têtes propres et standard) pour supprimer l'avertissement? Un pragma ou quelque chose?

kdbdallas
la source
oui, parfois vous avez besoin de dire au compilateur de ne pas vous avertir d'une variable inutilisée (selon lui) mais en fait vous pourriez l'utiliser commeBOOL ok = [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&d interval:NULL forDate:self]; NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);
thesummersign

Réponses:

145

Pour désactiver les avertissements par fichier, en utilisant Xcode 3 et llvm-gcc-4.2, vous pouvez utiliser:

#pragma GCC diagnostic ignored "-Wwarning-flag"

Où le nom d'avertissement est un indicateur d'avertissement gcc.

Cela remplace tous les indicateurs d'avertissement sur la ligne de commande. Cela ne fonctionne pas avec tous les avertissements. Ajoutez -fdiagnostics-show-option à votre CFLAGS et vous pourrez voir quel indicateur vous pouvez utiliser pour désactiver cet avertissement.

Robottobor
la source
Merci ! Exactement ce dont j'avais besoin!
Moszi
28
Un moyen simple d'obtenir le code d'avertissement: accédez au navigateur de journaux (Commande + 7), sélectionnez la version la plus élevée, développez le journal (le bouton '=' à droite) et faites défiler vers le bas.
Neal Ehardt
1
Pour ceux qui s'en soucient, une référence éducative des options d'avertissement GCC: gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Levi
2
Il semble #pragma GCC diagnostic ignored "-Wwarning-flag"déjà supprimé
allenlinli
1
@allenlinli c'est toujours là, il vous suffit de le remplacer warning-flagpar l'un des avertissements répertoriés dans gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Fonix
49

il existe un moyen plus simple de supprimer les avertissements de variables inutilisées :

#pragma unused(varname)

EDIT: source: http://www.cocoadev.com/index.pl?XCodePragmas

MISE À JOUR: Je suis tombé sur une nouvelle solution, une plus robuste

  1. Ouvrez l'onglet Projet> Modifier la cible active> Générer.
  2. Sous User-Defined: recherchez (ou créez si vous n'en trouvez pas) la clé: GCC_WARN_UNUSED_VARIABLEdéfinissez-la sur NO.

Exemple EDIT-2:

BOOL ok = YES;
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

le compilateur affiche un avertissement de variable inutilisée pour ok.

Solution:

BOOL ok = YES;
#pragma unused(ok)
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

PS: Vous pouvez également définir / réinitialiser d'autres avertissements GCC_WARN_ABOUT_RETURN_TYPE::YES/NO

le signe d'été
la source
31
Encore plus simple est de mettre __unused avant la déclaration de variable.
Mark Leonard
@ mark-leonard aurait dû être une réponse séparée, je la cherchais depuis des jours. J'ai dû commencer à lire des commentaires par désespoir. Je vous remercie.
Repose
35

Pour gcc, vous pouvez utiliser

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow-ivar"
// your code
#pragma GCC diagnostic pop

Vous pouvez en savoir plus sur le pragma GCC ici et pour obtenir le code d'avertissement d'un avertissement, accédez au Navigateur de rapports (Commande + 9), sélectionnez la version la plus élevée, développez le journal (le bouton '=' à droite) et faites défiler jusqu'au en bas et là, votre code d'avertissement est entre crochets comme celui-ci[-Wshadow-ivar]

Pour clang, vous pouvez utiliser

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop
Inder Kumar Rathore
la source
4
Clang prend en charge le pragma de GCC pour la compatibilité avec le code source existant. Il vous suffit donc d'écrire un pragma au format gcc.
Allen
1
À partir de Xcode 5.0, Clang était le seul compilateur fourni. Vous devrez donc peut-être utiliser le format pragma clang maintenant.
allenlinli
27

Afin de supprimer un avertissement pour un fichier individuel, procédez comme suit:

sélectionnez le fichier dans le projet xcode. appuyez sur obtenir des informations aller à la page avec les options de construction entrez -Wno- pour annuler un avertissement:

-Wno-

par exemple

-Waucun paramètre non utilisé

Vous pouvez obtenir le nom de l'avertissement si vous regardez les paramètres du projet, regardez les avertissements GCC situés en bas de la page de l'onglet de construction, en cliquant sur chaque avertissement, il vous indiquera le nom du paramètre d'avertissement:

par exemple

Avertir chaque fois qu'un paramètre de fonction est inutilisé en dehors de sa déclaration. [GCC_WARN_UNUSED_PARAMETER, -Wunused-parameter]

AndersK
la source
2
C'est une excellente solution lorsque vous avez inclus du code à partir d'une base de code que vous ne voulez pas modifier et qui déclenche des avertissements du compilateur ...
Mark Beaton
Cela semble être un excellent moyen, mais toutes les idées sur la façon dont vous le faites dans XCode 4
Santthosh
2
J'ai trouvé ma solution ici pour XCode 4 stackoverflow.com/questions/6057192/…
Santthosh
si vous avez besoin d'un avertissement de suppression pour un seul problème, comme le mien: ...m:45:69: Incompatible pointer types sending...j'ai ouvert l'explication de construction et [-Wincompatible-pointer-types]je trouve cet avertissement: je viens de le renommer -Wno-incompatible-pointer-typeset de l'ajouter comme indicateur à mon .mfichier ... boom plus d'avertissements ... +10 si je pourrais
Nicos Karalis
5

Avec Objective-C, un certain nombre d'erreurs graves n'apparaissent que sous forme d'avertissements. Non seulement je ne désactive jamais les avertissements, mais j'active normalement "Traiter les avertissements comme des erreurs" (-Werror).

Chaque type d'avertissement dans votre code peut être évité en faisant les choses correctement (normalement en convertissant les objets au type correct) ou en déclarant des prototypes lorsque vous en avez besoin.

Matt Gallagher
la source
14
Bien que ce soit un bon conseil général, il ne répond pas à la question. Tous les avertissements ne sont pas critiques ou sérieux; beaucoup sont assez triviaux. Supposons que l'on soit obligé d'utiliser une bibliothèque tierce et que l'on ne puisse pas la modifier, pour quelque raison que ce soit (base de code héritée, code destiné à être lié par un tiers, stipulation du patron, etc.) La suppression d'avertissements triviaux spécifiques est tout à fait acceptable dans ces cas.
Paul Legato
5

Pour supprimer l'avertissement: essayez de créer une interface de catégorie pour l'objet en question

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

-(void) myMethod {
...
   [theObject theUndocumentedMethod];
...
}

En passant, je déconseille fortement d' appeler des méthodes non documentées dans le code d'expédition. L'interface peut changer et va changer, et ce sera votre faute.

Mark Pauley
la source
Je fais cela également. J'appelle ma catégorie "Privé" et je la mets en haut du fichier .m ... Cela sert de moyen de faire suivre de déclarer les méthodes qui ne sont utilisées que dans le fichier. Je suis d'accord qu'un fichier d'en-tête privé serait plus standard, mais devoir constamment rebondir entre les fichiers pour quelque chose qui devrait vraiment être entièrement contenu (privé) dans l'implémentation est ennuyeux.
Pat Niemeyer
Donc, il s'avère que vous pouvez utiliser l'ancienne astuce C consistant à implémenter simplement la méthode avant que quoi que ce soit ne l'utilise. Ensuite, vous avez vous-même une méthode locale de fichier. Je pense que ce n'est pas privé cependant, donc d'autres fichiers pourraient éventuellement envoyer un message au sélecteur que vous définissez de cette manière.
Mark Pauley
3

Créez un nouveau fichier d'en-tête distinct appelé «Undocumented.h» et ajoutez-le à votre projet. Créez ensuite un bloc d'interface pour chaque classe sur laquelle vous souhaitez appeler des fonctions non documentées et attribuez à chacune une catégorie «(Non documenté)». Ensuite, incluez simplement ce fichier d'en-tête dans votre PCH. De cette façon, vos fichiers d'en-tête d'origine restent propres, il n'y a qu'un seul autre fichier à maintenir et vous pouvez commenter une ligne dans votre PCH pour réactiver à nouveau tous les avertissements.

J'utilise également cette méthode pour les fonctions dépréciées dans «Depreciated.h» avec une catégorie de «(Depreciated)».

la meilleure partie est que vous pouvez activer / désactiver sélectivement les avertissements individuels en commentant ou en décommentant les prototypes individuels.

Mark A. Donohoe
la source
1

La suppression de cet avertissement particulier n'est pas sûre. Le compilateur a besoin de connaître les types d'arguments et retourne à une méthode pour générer le code correct.

Par exemple, si vous appelez une méthode comme celle-ci

[foo doSomethingWithFloat: 1.0];

qui prend un float, et il n'y a aucun prototype visible, alors le compilateur devinera que la méthode prend un double, pas un float. Cela peut provoquer des plantages et des valeurs mal interprétées. Dans l'exemple ci-dessus, sur une petite machine endian comme les machines Intel, la méthode du récepteur verrait 0 passé, pas 1.

Vous pouvez lire pourquoi dans la documentation ABI i386 ou simplement corriger vos avertissements. :-)

Ken
la source
2
Bon conseil, mais ne répond pas réellement à la question, comme ci-dessus.
Paul Legato