web-dev-qa-db-fra.com

Macro de paramètres UNUSED portable utilisée sur la signature de fonction pour C et C ++

Je souhaite créer une macro pour éliminer l'avertissement de variable inutilisée.

Cette question décrit un moyen de supprimer l'avertissement de paramètre inutilisé en écrivant une macro dans le code de fonction:

Manière universellement indépendante du compilateur d'implémenter une macro NON UTILISÉE en C/C++

Mais je suis intéressé par une macro qui peut être utilisée dans la signature de fonction:

void callback(int UNUSED(some_useless_stuff)) {}

Voici ce que j'ai découvert avec Google ( source )

#ifdef UNUSED
#Elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#Elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#Elif defined(__cplusplus)
# define UNUSED(x)
#else
# define UNUSED(x) x
#endif

Cela peut-il être étendu à d'autres compilateurs?

Edit: Pour ceux qui ne comprennent pas comment fonctionne le balisage: je veux une solution pour C et C++. C'est pourquoi cette question est balisée à la fois C et C++ et c'est pourquoi une solution C++ uniquement n'est pas acceptable.

34
Let_Me_Be

Après avoir testé et suivi les commentaires, la version originale mentionnée dans la question s'est avérée être assez bonne.

L'utilisation de: #define UNUSED(x) __pragma(warning(suppress:4100)) x (mentionnée dans les commentaires), peut être nécessaire pour compiler C sur MSVC, mais c'est une combinaison tellement bizarre que je ne l'ai pas incluse à la fin.

9
Let_Me_Be

La façon dont je le fais est comme ceci:

#define UNUSED(x) (void)(x)
void foo(const int i) {
    UNUSED(i);
}

Je n'ai eu aucun problème avec cela dans Visual Studio, Intel, gcc et clang.

L'autre option consiste à simplement commenter le paramètre:

void foo(const int /*i*/) {
  // When we need to use `i` we can just uncomment it.
}
22
Matt Clarkson

Juste une petite chose, il vaut mieux utiliser __attribute__((__unused__)) as __attribute__((unused)), car inutilisé peut être défini quelque part comme macro, personnellement j'ai eu quelques problèmes avec cette situation.

Mais l'astuce que j'utilise est que j'ai trouvé plus lisible:

#define UNUSED(x) (void)x;

Cela ne fonctionne cependant que pour les variables et les arguments des méthodes, mais pas pour la fonction elle-même.

7
doc_ds

Sur de nombreux compilateurs, j'ai utilisé les éléments suivants, à l'exclusion de la prise en charge de peluches.

#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
#       define PGM_GNUC_UNUSED         __attribute__((__unused__))
#else
#       define PGM_GNUC_UNUSED
#endif

Compilateurs testés: GCC, Clang, EKOPath, Intel C Compiler/Composer XE, MinGW32 sur Cygwin/Linux/MSYS, MinGW-w64 sur Cygwin/Linux, Sun ONE Studio/Oracle Solaris Studio, Visual Studio 2008/2010.

Exemple d'utilisation:

pgm_tsc_init (
        PGM_GNUC_UNUSED pgm_error_t**   error
        )
{
...
}

PGM est le préfixe standard pour ce projet basé sur C. GNUC est la convention de GLib pour cet attribut.

Je pense qu'une compilation met en garde contre __attribute__ dans certaines circonstances mais certainement pas d'erreur.

6
Steve-o