321 votes

Comment réduire au silence un avertissement concernant des variables inutilisées ?

J'ai une application multiplateforme et dans certaines de mes fonctions, toutes les valeurs transmises aux fonctions ne sont pas utilisées. Je reçois donc un avertissement de GCC me disant qu'il y a des variables inutilisées.

Quelle serait la meilleure façon de coder pour contourner cet avertissement ?

Un #ifdef autour de la fonction ?

#ifdef _MSC_VER
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal qrLeft, qreal qrTop, qreal qrWidth, qreal qrHeight)
#else
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal /*qrLeft*/, qreal /*qrTop*/, qreal /*qrWidth*/, qreal /*qrHeight*/)
#endif
{

C'est tellement laid mais cela semble être la façon que le compilateur préférerait.

Ou dois-je assigner zéro à la variable à la fin de la fonction ? (ce que je déteste car cela modifie quelque chose dans le déroulement du programme pour faire taire un avertissement du compilateur).

Existe-t-il une méthode correcte ?

7 votes

Je viens de réaliser que vous avez posé une question similaire en novembre dernier. C'est pourquoi elle me semble familière ! ;) stackoverflow.com/questions/308277/

9 votes

Pourquoi ne pas simplement les commenter pour les deux compilateurs ? Si l'argument est inutilisé sur l'un, il le sera probablement sur l'autre...

12 votes

Vous devez savoir que Qt dispose d'un Q_UNUSED macro juste pour ça. Consultez-la dans la documentation.

30voto

Marcin Wyszynski Points 531

Une méthode encore plus propre consiste à commenter les noms des variables :

int main(int /* argc */, char const** /* argv */) {
  return 0;
}

11 votes

Ce n'est pas bon si vous avez doxygen et que vous voulez documenter les paramètres.

23 votes

@AlexisWilke : Cela pourrait être qualifié de bug dans doxygen, IMO.

3 votes

Vous pouvez #define YOUR_PROJECT_UNUSED(argname) conditionnellement à #ifdef DOXYGEN pour que doxygen puisse voir le nom et que le vrai compilateur ne le voie pas, via int main(int YOUR_PROJECT_UNUSED(argc), ...). Pas fabuleux, mais ça marche.

27voto

DigitalTrauma Points 6235

gcc ne signale pas ces avertissements par défaut. Cet avertissement doit avoir été activé soit explicitement en passant la commande -Wunused-parameter au compilateur ou implicitement en passant -Wall -Wextra (ou éventuellement une autre combinaison de drapeaux).

Les avertissements relatifs aux paramètres inutilisés peuvent simplement être supprimés en passant le paramètre -Wno-unused-parameter au compilateur, mais notez que cet indicateur de désactivation doit venir après tout indicateur d'activation possible pour cet avertissement dans la ligne de commande du compilateur, afin qu'il puisse prendre effet.

25voto

Un collègue de travail vient de me montrer cette jolie petite macro. ici

Pour plus de facilité, je vais inclure la macro ci-dessous.

#ifdef UNUSED
#elif defined(__GNUC__) 
# define UNUSED(x) UNUSED_ ## x __attribute__((unused)) 
#elif defined(__LCLINT__) 
# define UNUSED(x) /*@unused@*/ x 
#else 
# define UNUSED(x) x 
#endif

void dcc_mon_siginfo_handler(int UNUSED(whatsig))

16voto

Philippe Points 127

Une façon sans macro et portable de déclarer un ou plusieurs comme inutilisés :

template <typename... Args> inline void unused(Args&&...) {}

int main(int argc, char* argv[])
{
    unused(argc, argv);
    return 0;
}

10voto

krupan Points 1056

J'ai vu cela au lieu de la (void)param2 une façon de faire taire l'avertissement :

void foo(int param1, int param2)
{
    std::ignore = param2;
    bar(param1);
}

Il semble que cela ait été ajouté dans C++11

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X