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.
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.
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.
}
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.
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.