321 votes

Comment réduire au silence un avertissement concernant des variables inutilisées ?

J'ai une application multiplateforme et dans certaines de mes fonctions, toutes les valeurs transmises aux fonctions ne sont pas utilisées. Je reçois donc un avertissement de GCC me disant qu'il y a des variables inutilisées.

Quelle serait la meilleure façon de coder pour contourner cet avertissement ?

Un #ifdef autour de la fonction ?

#ifdef _MSC_VER
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal qrLeft, qreal qrTop, qreal qrWidth, qreal qrHeight)
#else
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal /*qrLeft*/, qreal /*qrTop*/, qreal /*qrWidth*/, qreal /*qrHeight*/)
#endif
{

C'est tellement laid mais cela semble être la façon que le compilateur préférerait.

Ou dois-je assigner zéro à la variable à la fin de la fonction ? (ce que je déteste car cela modifie quelque chose dans le déroulement du programme pour faire taire un avertissement du compilateur).

Existe-t-il une méthode correcte ?

7 votes

Je viens de réaliser que vous avez posé une question similaire en novembre dernier. C'est pourquoi elle me semble familière ! ;) stackoverflow.com/questions/308277/

9 votes

Pourquoi ne pas simplement les commenter pour les deux compilateurs ? Si l'argument est inutilisé sur l'un, il le sera probablement sur l'autre...

12 votes

Vous devez savoir que Qt dispose d'un Q_UNUSED macro juste pour ça. Consultez-la dans la documentation.

424voto

Alex B Points 34304

Vous pouvez mettez-le dans " (void)var; "Expression (ne fait rien) pour qu'un compilateur voit qu'il est utilisé. Ceci est portable entre compilateurs.

Par exemple

void foo(int param1, int param2)
{
    (void)param2;
    bar(param1);
}

Ou,

#define UNUSED(expr) do { (void)(expr); } while (0)
...

void foo(int param1, int param2)
{
    UNUSED(param2);
    bar(param1);
}

26 votes

+1 - je voudrais quand même documenter pourquoi vous n'utilisez pas la variable même si elle est là.

22 votes

C'est ainsi que Q_UNUSED est en principe mis en œuvre.

0 votes

Hmm, avec MSVC2012 j'obtiens 'cannot convert from nullptr to void' quand j'utilise ceci avec nullptr (c'est une bibliothèque modélisée), soupir.

139voto

ezpz Points 5273

Dans GCC et Clang, vous pouvez utiliser la fonction __attribute__((unused)) pour atteindre votre objectif.
Par exemple :

int foo (__attribute__((unused)) int bar) {
   return 0;
}

4 votes

C'est la meilleure solution pour les fonctions de rappel.

2 votes

Egalement supporté par clang : clang.llvm.org/docs/

2 votes

@SonicAtom Non, car il n'est pas portable.

129voto

scx Points 706

C++17 fournit maintenant la fonction [[maybe_unused]] attribut.

http://en.cppreference.com/w/cpp/language/attributes

Assez agréable et standard.

56voto

Shafik Yaghmour Points 42198

Mise à jour C++17

En C++17, nous obtenons l'attribut [[peut-être_non utilisé]] qui est couverte dans [dcl.attr.unused]

L'attribut-token maybe_unused indique qu'un nom ou une entité est peut-être intentionnellement inutilisé. Il doit apparaître au maximum une fois dans chaque liste d'attributs et aucune clause d'argument d'attribut ne doit être présente. ...

Exemple :

 [[maybe_unused]] void f([[maybe_unused]] bool thing1,
                        [[maybe_unused]] bool thing2) {
  [[maybe_unused]] bool b = thing1 && thing2;
    assert(b);
 }

Les implémentations ne doivent pas avertir que b est inutilisé, que NDEBUG soit défini ou non. -fin de l'exemple ]

Dans l'exemple suivant :

int foo ( int bar) {
    bool unused_bool ;
    return 0;
}

Clang et gcc génèrent tous deux un diagnostic en utilisant -Mur -Wextra pour les deux bar y inutilisé_bool ( Voir en direct ).

Tout en ajoutant [[peut-être_non utilisé]] met en sourdine les diagnostics :

int foo ([[maybe_unused]] int bar) {
    [[maybe_unused]] bool unused_bool ;
    return 0;
}

voir en direct .

Avant C++17

En C++11, une forme alternative de l'option UNUSED pourrait être formée en utilisant une expression lambda( _via Ben Deane_ ) avec une capture de la variable non utilisée :

#define UNUSED(x) [&x]{}()

L'invocation immédiate de l'expression lambda doit être optimisée, comme dans l'exemple suivant :

int foo (int bar) {
    UNUSED(bar) ;
    return 0;
}

nous pouvons voir dans godbolt que l'appel est optimisé :

foo(int):
xorl    %eax, %eax
ret

46voto

alex tingle Points 3134

Votre solution actuelle est la meilleure - commentez le nom du paramètre si vous ne l'utilisez pas. Cela s'applique à tous les compilateurs, donc vous n'avez pas besoin d'utiliser le pré-processeur pour le faire spécialement pour GCC.

8 votes

Juste pour renforcer cette réponse - vous n'avez pas besoin du #ifdef, commentez simplement les noms de paramètres inutilisés.

6 votes

J'ai un cas où le paramètre fait partie d'une fonction de rappel et le fait de le commenter interrompt la compilation (je ne sais donc pas pourquoi). g++ met en garde à ce sujet). Dans un tel cas, que recommanderiez-vous ?

1 votes

Imaginez une méthode virtuelle en ligne avec des paramètres inutilisés /*commentés*/, le client de l'interface ne verra pas le nom du paramètre lors de l'autocomplétion dans la plupart des IDE. Dans ce cas, la solution UNUSED() est plus pratique, bien que moins propre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X