Par exemple:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
En C ++, j'ai pu mettre un /*...*/
commentaire sur les paramètres. Mais pas en C bien sûr, où ça me donne l'erreur error: parameter name omitted
.
c
gcc
gcc-warning
nixgadget
la source
la source
-Wno-unused-parameter
, c'est juste trop bruyant et attrape rarement des bugs en particulier. quand-Wshadow
est utilisé.Réponses:
J'écris généralement une macro comme celle-ci:
Vous pouvez utiliser cette macro pour tous vos paramètres inutilisés. (Notez que cela fonctionne sur n'importe quel compilateur.)
Par exemple:
la source
void f(int x) {UNUSED(x);}
.#define UNUSED(...) (void)(__VA_ARGS__)
ce qui me permet d'appliquer cela à plusieurs variables.Dans gcc, vous pouvez étiqueter le paramètre avec l'
unused
attribut .En pratique, cela se fait en mettant
__attribute__ ((unused))
juste avant le paramètre. Par exemple:devient
la source
__attribute__ ((unused))
en avant l'argument.__attribute__((unused))
s'agit d' une extension GCC propriétaire . Il est pris en charge par d'autres compilateurs, mais je suppose que cela ne fonctionnera pas avec MSVC. Ce n'est pas directement une partie de la norme du compilateur, donc ce n'est pas aussi portable que d'autres optionsVous 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 bavard / laid.Ensuite, vous pouvez faire ...
Je préfère cela parce que vous obtenez une erreur si vous essayez d'utiliser
bar
le code n'importe où, vous ne pouvez donc pas laisser l'attribut par erreur.et pour les fonctions ...
Note 1):
Pour autant que je sache, MSVC n'a pas d'équivalent à
__attribute__((__unused__))
.Note 2):
La
UNUSED
macro ne fonctionnera pas pour les arguments qui contiennent des parenthèses,donc si vous avez un argument comme
float (*coords)[3]
vous ne pouvez pas le faire,float UNUSED((*coords)[3])
oufloat (*UNUSED(coords))[3]
, c'est le seul inconvénient de laUNUSED
macro que j'ai trouvé jusqu'à présent, dans ces cas, je retombe à(void)coords;
la source
#define __attribute__(x)
pour un environnement non-GCC (aucun AFAIK n'est__attribute__
pris en charge par MSVC)?warning: unused parameter ‘foo’ [-Wunused-parameter]
(gcc 7.3.0)Avec gcc avec l'attribut inutilisé:
la source
Voyant que cela est marqué comme gcc, vous pouvez utiliser le commutateur de ligne de commande
Wno-unused-parameter
.Par exemple:
Bien sûr, cela affecte l'ensemble du fichier (et peut-être le projet en fonction de l'endroit où vous définissez le commutateur), mais vous n'avez pas à modifier de code.
la source
Une manière spécifique à gcc / g ++ de supprimer l'avertissement de paramètre inutilisé pour un bloc de code source consiste à le joindre aux instructions pragma suivantes:
la source
L'étiquetage de l'attribut est le moyen idéal. MACRO conduit parfois à la confusion. et en utilisant void (x), nous ajoutons une surcharge dans le traitement.
Si vous n'utilisez pas d'argument d'entrée, utilisez
Si vous n'utilisez pas la variable définie à l'intérieur de la fonction
Maintenant, utilisez plus tard 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".
REMARQUE: il s'agit simplement de supprimer l'avertissement et non d'optimiser.
la source
void(x)
, le compilateur l'optimisera.J'ai le même problème. J'ai utilisé une bibliothèque tierce. Lorsque je compile cette bibliothèque, le compilateur (gcc / clang) se plaindra des variables inutilisées.
Comme ça
La solution est donc assez claire. L'ajout en
-Wno-unused
tant que gcc / clang CFLAG supprimera tous les avertissements "inutilisés", même si vous les avez-Wall
définis.De cette façon, vous N'AVEZ PAS BESOIN de modifier un code.
la source
Dans MSVC pour supprimer un avertissement particulier, il suffit de spécifier le numéro à compiler sous / wd #. Mon CMakeLists.txt contient tel le bloc:
Maintenant, je ne peux pas dire ce que signifie exactement / wd4512 / wd4702 / wd4100 / wd4510 / wd4355 / wd4127, car je ne prête aucune attention à MSVC pendant trois ans, mais ils suppriment les avertissements superpédantaires qui n'influencent pas le résultat.
la source
J'ai vu ce style utilisé:
la source
struct { int a; } b = {1}; if (b);
GCC met en garde,used struct type value where scalar is required
.Pour mémoire, j'aime la réponse de Job ci-dessus, mais je suis curieux de voir une solution utilisant simplement le nom de variable par lui-même dans une instruction "ne rien faire":
Bien sûr, cela a des inconvénients; par exemple, sans la note "inutilisée", cela ressemble à une erreur plutôt qu'à une ligne de code intentionnelle.
L'avantage est qu'aucun DEFINE n'est nécessaire et il supprime l'avertissement.
Existe-t-il des différences de performances, d'optimisation ou autres?
la source