web-dev-qa-db-fra.com

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

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

Par exemple, j'appelle une méthode non documentée et comme cette méthode ne figure pas dans l'en-tête, un avertissement s'affiche lors de la compilation. Je sais que je peux l'ajouter à l'en-tête pour arrêter l'avertissement, mais je me demande s'il existe un moyen autre 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?

113
kdbdallas

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

#pragma GCC diagnostic ignored "-Wwarning-flag"

Où nom d'avertissement est un drapeau d'avertissement gcc.

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

141
robottobor

il existe un moyen plus simple de supprimer Variable non utilisée les avertissements:

#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> Construire.
  2. En dessous de User-Defined: trouvez (ou créez si vous n'en trouvez pas) la clé: GCC_WARN_UNUSED_VARIABLE le mettre à NO.

EDIT-2 Exemple:

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 un autre avertissement: GCC_WARN_ABOUT_RETURN_TYPE: YES/NO

48
thesummersign

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 GCC pragma here et pour obtenir le code d’avertissement d’un avertissement, accédez au Navigateur de rapports (Commande + 9), sélectionnez la version la plus récente, développez le journal (le bouton '=' du à droite), et faites défiler vers le bas et votre code d’avertissement est entre crochets, comme ceci [-Wshadow-ivar]

Pour clang, vous pouvez utiliser

#pragma clang diagnostic Push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop
33

Pour appliquer un avertissement à un fichier individuel, procédez comme suit:

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

-Wno-

par exemple.

Paramètre -Non-non utilisé

Vous pouvez obtenir le nom de l'avertissement si vous regardez dans les paramètres du projet, consultez les avertissements GCC situés au bas de la page à onglet 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, paramètre -Wunused]

26
Anders

Pour vous débarrasser de 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 fortement déconseille d'appeler des méthodes non documentées dans le code d'expédition. L'interface peut et va changer, et ce sera de votre faute.

5
Mark Pauley

http://nshipster.com/pragma/#inhibiting-warnings - ne passez pas à la section relative aux inhibitions

4
Austin France

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

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

4
Matt Gallagher

Créez un nouveau fichier d'en-tête séparé appelé 'Undocumented.h' et ajoutez-le à votre projet. Créez ensuite un bloc d'interface pour chaque classe pour laquelle vous souhaitez appeler des fonctions non documentées et attribuez à chacune une catégorie de '(Non documenté)'. Ensuite, incluez ce fichier d’en-tête dans votre PCH. Ainsi, vos fichiers d'en-tête d'origine restent propres, il ne reste qu'un seul fichier à gérer et vous pouvez commenter une ligne de votre PCH pour réactiver tous les avertissements.

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

la meilleure partie est que vous pouvez activer/désactiver de manière sélective les avertissements individuels en commentant ou en ne commentant pas les prototypes individuels.

3
MarqueIV

La suppression de cet avertissement n’est pas sûre. Le compilateur doit connaître les types des arguments et revenir à une méthode pour générer le code correct.

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

[foo doWethingWithFloat: 1.0];

cela prend un float, et il n'y a pas de 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 = i386 ABI docs , ou simplement corriger vos avertissements. :-)

1
Ken