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.

Gregory Higley
la source

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];
Sherm Pendley
la source
107

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

BOOL saved __unused;
JOM
la source
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.

Grenouille noire
la source
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.

Danny Xu
la source
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.

user3125367
la source
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

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

essayez avec: l'attribut __unused. Fonctionne dans Xcode 5

João Nunes
la source
5

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

Ar Non
la source
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.

Trenskow
la source
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;
0xFADE
la source