web-dev-qa-db-fra.com

Comment supprimer les avertissements "paramètre inutilisé" en C?

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.

190
nixgadget

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);
    ...
}
273
Job

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) { }
96
Philip Potter

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;

56
ideasman42

Avec gcc avec l'attribut inutilisé:

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

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.

9
Paul Hutchinson

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.

5
user2452561

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
5
Calm

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.

3
landerlyoung

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.

1
Bwana The Master

J'ai vu ce style être utilisé:

if (when || who || format || data || len);
0
Iustin