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

Je suis intéressé par la création d’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:

Méthode universellement indépendante du compilateur d’implémenter une macro UNUSED en C / C ++

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

void callback(int UNUSED(some_useless_stuff)) {}

C’est ce que j’ai creusé avec Google ( source )

 #ifdef UNUSED #elif defined(__GNUC__) # define UNUSED(x) UNUSED_ ## x __atsortingbute__((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 développé pour d’autres compilateurs?

Edit: Pour ceux qui ne comprennent pas le fonctionnement du marquage: je souhaite une solution pour C et C ++. C’est pourquoi cette question est balisée à la fois en C et en C ++ et c’est pourquoi une solution uniquement en C ++ n’est pas acceptable.

Voici comment je le fais:

 #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 à commenter le paramètre:

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

Après avoir testé et suivi les commentaires, la version originale mentionnée dans la question s’est avérée suffisante.

Using: #define UNUSED(x) __pragma(warning(suppress:4100)) x (mentionné dans les commentaires), peut être nécessaire pour comstackr C sur MSVC, mais c’est une telle combinaison que je ne l’ai pas inclus à la fin .

Juste une petite chose, il vaut mieux utiliser __atsortingbute__((__unused__)) comme __atsortingbute__((unused)) , car inutilisé pourrait être un endroit défini comme une macro, personnellement, j’ai eu quelques problèmes avec cette situation.

Mais le truc que j’utilise est ce que je trouve plus lisible, c’est:

#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é ce qui suit, à l’exclusion du support pour les peluches.

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

Compilateurs testés: GCC, Clang, EKOPath, Compilateur C Intel / Compositeur 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 de ce projet basé sur C. GNUC est la convention de GLib pour cet atsortingbut.

Je pense qu’une compilation met en garde sur __atsortingbute__ dans certaines circonstances mais certainement pas d’erreur.