Par exemple:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
En C++, j'ai pu mettre un commentaire /*...*/
autour des paramètres. Mais pas en C bien sûr, où cela me donne l'erreur error: parameter name omitted
.
J'écris habituellement une macro comme ceci:
#define UNUSED(x) (void)(x)
Vous pouvez utiliser cette macro pour tous vos paramètres inutilisés. (Notez que cela fonctionne sur n'importe quel compilateur.)
Par exemple:
void f(int x) {
UNUSED(x);
...
}
Dans gcc, vous pouvez étiqueter le paramètre avec unused
attribut .
Cet attribut, attaché à une variable, signifie que la variable est censée être éventuellement non utilisée. GCC ne produira pas d'avertissement pour cette variable.
En pratique, ceci est accompli en plaçant __attribute__ ((unused))
juste avant le paramètre. Par exemple:
void foo(workerid_t workerId) { }
devient
void foo(__attribute__((unused)) workerid_t workerId) { }
Vous pouvez utiliser l'attribut inutilisé de gcc/clang, mais j'utilise ces macros dans un en-tête pour éviter d'avoir des attributs spécifiques à gcc partout dans la source. Avoir aussi __attribute__
partout est un peu verbeux/moche.
#ifdef __GNUC__
# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
#else
# define UNUSED(x) UNUSED_ ## x
#endif
#ifdef __GNUC__
# define UNUSED_FUNCTION(x) __attribute__((__unused__)) UNUSED_ ## x
#else
# define UNUSED_FUNCTION(x) UNUSED_ ## x
#endif
Alors tu peux faire ...
void foo(int UNUSED(bar)) { ... }
Je préfère cela car vous obtenez une erreur si vous essayez d'utiliser bar
dans le code n'importe où, vous ne pouvez donc pas laisser l'attribut par erreur.
et pour les fonctions ...
static void UNUSED_FUNCTION(foo)(int bar) { ... }
Note 1):
Autant que je sache, MSVC n’a pas d’équivalent à __attribute__((__unused__))
.
Note 2):
La macro UNUSED
ne fonctionnera pas pour les arguments contenant des parenthèses,
donc si vous avez un argument comme float (*coords)[3]
vous ne peut pas faire,float UNUSED((*coords)[3])
ou float (*UNUSED(coords))[3]
, c’est le seul inconvénient de la macro UNUSED
que j’ai trouvée jusqu’à présent. Dans ce cas, je retombe sur (void)coords;
Avec gcc avec l'attribut inutilisé:
int foo (__attribute__((unused)) int bar) {
return 0;
}
Comme cela est marqué comme gcc, vous pouvez utiliser le commutateur de ligne de commande Wno-unused-parameter
.
Par exemple:
gcc -Wno-unused-parameter test.c
Bien sûr, cela affecte tout le fichier (et peut-être le projet en fonction de l'emplacement du commutateur), mais vous ne devez modifier aucun code.
L'étiquetage de l'attribut est le moyen idéal. MACRO est parfois source de confusion. et en utilisant void (x), nous ajoutons une surcharge de traitement.
Si vous n'utilisez pas d'argument d'entrée, utilisez
void foo(int __attribute__((unused))key)
{
}
Si vous n'utilisez pas la variable définie dans la fonction
void foo(int key)
{
int hash = 0;
int bkt __attribute__((unused)) = 0;
api_call(x, hash, bkt);
}
Maintenant, plus tard, en utilisant la variable de hachage pour votre logique mais n’a pas besoin de bkt. définir bkt comme inutilisé, sinon le compilateur dit: 'bkt set bt not used ".
NOTE: Ceci est juste pour supprimer l'avertissement pas pour l'optimisation.
Une manière spécifique à gcc/g ++ de supprimer l'avertissement de paramètre inutilisé pour un bloc de code source consiste à l'enfermer avec les instructions pragma suivantes:
#pragma GCC diagnostic Push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop
J'ai le même problème. J'ai utilisé une troisième bibliothèque. Quand je compilerai cette bibliothèque, le compilateur (gcc/clang) se plaindra des variables inutilisées.
Comme ça
test.cpp: 29: 11: avertissement: variable 'magic' définie mais non utilisée [-Wunused-but-set-variable] courte magie [] = {
test.cpp: 84: 17: avertissement: variable non utilisée 'before_write' [-Wunused-variable] int64_t before_write = Thread :: currentTimeMillis ();
La solution est donc assez claire. Ajouter -Wno-unused
en tant que gcc/clang CFLAG supprimera tous les avertissements "non utilisés", même si vous avez défini -Wall
.
De cette façon, vous N'AVEZ PAS BESOIN de changer le code.
Dans MSVC, pour supprimer un avertissement particulier, il suffit de spécifier le numéro du compilateur sous la forme/wd #. Mon CMakeLists.txt contient le bloc suivant:
If (MSVC)
Set (CMAKE_EXE_LINKER_FLAGS "$ {CMAKE_EXE_LINKER_FLAGS} / NODEFAULTLIB: LIBCMT")
Add_definitions (/W4 /wd4512 /wd4702 /wd4100 /wd4510 /wd4355 /wd4127)
Add_definitions (/D_CRT_SECURE_NO_WARNINGS)
Elseif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUC)
Add_definitions (-Wall -W -pedantic)
Else ()
Message ("Unknown compiler")
Endif ()
Maintenant, je ne peux pas dire ce que signifient exactement/wd4512/wd4702/wd4100/wd4510/wd4355/wd4127, car je ne prête aucune attention à MSVC pendant trois ans, mais ils suppriment les avertissements superpédantiques qui n’influencent pas le résultat.
J'ai vu ce style être utilisé:
if (when || who || format || data || len);