Comment puis-je me débarrasser d'un avertissement «variable inutilisée» dans Xcode?


98

Je comprends exactement pourquoi des avertissements de variables inutilisées se produisent. Je ne veux pas les supprimer en général, car ils sont incroyablement utiles dans la plupart des cas. Cependant, considérez le code (artificiel) suivant.

NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);

Xcode signale qu'il saveds'agit d'une variable inutilisée, alors que ce n'est bien sûr pas le cas. Je soupçonne que c'est parce que NSAssert1c'est une macro. La NS_BLOCK_ASSERTIONSmacro n'est pas définie, donc les assertions Objective C sont définitivement activées.

Bien que cela ne fasse aucun mal, je trouve cela désordonné et ennuyeux, et je veux le supprimer, mais je ne sais pas comment le faire. Assigner la variable à elle-même supprime l'avertissement du compilateur, mais je préfère le faire de la «bonne» façon si une telle chose existe.

Réponses:


107

Je ne sais pas s'il est toujours pris en charge dans le nouveau compilateur LLVM, mais GCC a un attribut "non utilisé" que vous pouvez utiliser pour supprimer cet avertissement:

BOOL saved __attribute__((unused)) = [moc save:&error];

Sinon (dans le cas où LLVM ne prend pas en charge ce qui précède), vous pouvez diviser la déclaration de variable sur une ligne distincte, garantissant que la variable serait "utilisée", que la macro se développe ou non:

BOOL saved = NO;
saved = [moc save:&error];

107

En utilisant Xcode 4.3.2 et j'ai découvert que cela semble fonctionner (moins d'écriture)

BOOL saved __unused;

Cela ne fonctionne pas pour moi, je reçois un avertissement que'saved' was marked as unused but was used
Heath Borders

37

Dans Xcode, vous pouvez définir les avertissements pour «Variables inutilisées». Accédez à "Paramètres de construction" pour la cible et filtrez avec le mot "inutilisé"

Voici une capture d'écran: Capture d'écran des paramètres Builld

Je vous suggère de le changer uniquement pour le débogage. De cette façon, vous ne manquez rien dans votre version de sortie.


37
Avez-vous manqué la partie de la question où Gregory a dit "Je ne veux pas les supprimer en général, car ils sont incroyablement utiles dans la plupart des cas"?
Sherm Pendley

8
@ShermPendley Quoi qu'il en soit, c'est toujours utile, cela a répondu à ma question sur la façon de l'éteindre globalement.
raffian

9
désactiver les avertissements est un excellent moyen de manquer les bogues. Je déconseille vivement.
orion elenzil

2
@orionelenzil - eh bien, oui et non. Il y a un vrai problème d'interface avec les faux positifs. L'avertissement apparaît constamment pendant que vous écrivez du code si vous n'avez pas atteint la partie du code où vous utilisez la variable. Au fil du temps, cela vous apprendra à ignorer l'avertissement, ce qui signifie que vous risquez de manquer des erreurs plus importantes. Il serait préférable de pouvoir supprimer l'erreur dans les blocs de code en cours d'édition active.
TechZen

Salut, ça marche bien si je mets NON. mais mon doute est: je dois définir le débogage et la libération NON y a seulement Variable inutilisée: NON? lequel je dois définir. Si je mets Totalement NON, alors il ne crée aucun problème lors de la version NA?
SR Nayak

22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

Essayez comme ça. Ça marche pour moi. Cela fonctionnera aussi pour vous.


Cela ne fonctionne pas pour moi, je reçois un avertissement que'saved' was marked as unused but was used
Heath Borders

15

La seule façon simple et portable de marquer une variable comme utilisée est… de l'utiliser.

BOOL saved = ...;
(void)saved; // now used

Vous serez peut-être satisfait des extensions spécifiques au compilateur déjà décrites.


2
Je préfère cela au laid #pragma décrit ci-dessus.
Northernman

1
Hey bro, nice tip
dimazava

14
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

LA SOURCE


C'est l'approche la plus propre car elle désactive uniquement l'avertissement entre ces #pragmas
cornr


5

Vous pouvez définir "Non" l' avertissement du complilateur LLVM 2.0 sur "Release"entrez la description de l'image ici


4

C'est ainsi que vous le faites en C et donc aussi en Objective-C.

Même si les avertissements ne sont pas activés, il est toujours judicieux de marquer la valeur de retour comme explicitement ignorée. Cela montre également aux autres développeurs que vous n'avez pas simplement oublié la valeur de retour - vous avez en effet explicitement choisi de l'ignorer.

(void)[moc save:&error];

EDIT: les compilateurs ignorent les castings void, donc cela ne devrait pas affecter les performances - c'est juste une belle annotation humaine propre.


Dans certains contextes, vous DEVEZ utiliser ce hack pour obtenir le code Objective-C à compiler. L'utilisation (void)est la manière la plus claire de procéder, merci!
Dan Rosenstark

1

Faites-le prendre deux lignes. Séparez la déclaration et la valeur par défaut

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.