IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Variable non utilisée dans macro


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2013
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 31
    Par défaut Variable non utilisée dans macro
    Bonjour,

    J'ai récupéré un code qui contient des macros. Ces macros introduisent une variable qui est déclaré juste au dessus. Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #ifndef TOTO
    static double truc;
    #define TOTO(a) ((truc=(a)) == 0.0 ? 0.0 : 2*truc) //on est d'accord ca a pas trop d'interet mais ce n'est qu'un exmple
    #endif
    Le problème c'est que toutes les macros ne sont pas utilisées, mais sont quand même définies (j'ai un doute sur le vocabulaire). Disons qu'on rentre bien dans la macro, mais que dans le code, il n'y a nul part TOTO(bidule).

    Ca amène donc à la compilation un warning du genre: "Eh, t'as déclaré truc mais tu l'as pas utilisé". Je peux comprendre ce qui le chagrine mais je voudrais supprimer ce warning. J'ai quand meme le droit de dire ce que fera ma macro TOTO si jamais on l'utilise sans pour autant devoir l'utiliser à tous les coups derrière...

    Auriez-vous donc une astuce? (je ne veux pas par contre d'options de compil' qui cacheraient le warning. Je veux le supprimer.)

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    il suffit de l'utiliser.
    au moins une fois.
    Pour ce faire, dans le main, tu peux ajouter (void)truc;

  3. #3
    Membre averti
    Inscrit en
    Mars 2013
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 31
    Par défaut
    Du coup, je perd l'intéret de la chose puisque je compile des choses qui ne sont pas utiles... Et puis, mon programme est suffisamment compliqué, je n'ai pas trop envie de rajouter autant de ligne de code que de macro non utilisées...

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    tu ne les utilises pas, ne les défini pas.
    ca doit être possible, quitte à placer les defines dans un fichier autonome

  5. #5
    Membre averti
    Inscrit en
    Mars 2013
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 31
    Par défaut
    Dans certains cas d'études, je serais amener à utiliser ces macros. J'ai donc pour contrainte de les définir même si pour l'instant ça ne sert visiblement à rien.
    C'est bien là le problème. S'il s'agissait simplement de supprimer ce dont je ne me sert pas, je n'aurais pas posté la question ici

    Un autre exemple concret qui montre bien l'interet de définir les macros:
    Celles-ci se trouve dans un .h. Dans ce .h, je fais appel à TOTO (avec TOTO(bidule)). Là pas de soucis, ma variable truc est déclarée et utilisée. Par contre, j'ai en plus de ça un .cpp, qui contient l'appel à une autre macro (qu'on va appelé TATA) et qui est elle aussi définie dans le .h juste à coté de TOTO.
    J'ai donc bien sur un include<...h> en haut de mon .cpp. Mais là, chose étrange, j'ai quand même un warning qui me dis "hep, la variable tructata que tu as défini pour ta macro TATA, tu l'as défini dans ton .h, mais tu l'as pas utilisée!!!"

    Pourtant elle est utilisé dans mon .cpp... Ca me fait quand même un warning. Et là, je ne peux pas supprimer la macro comme tu le suggère, sinon, dans mon .cpp, je vais faire appel à TATA mais sans l'avoir définie auparavant. Ca risque de moins bien marcher...

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Joa,

    Habituellement, la solution est d'encadrer ton #ifndef par un autre, de niveau supérieur.

    Il n'est pas rare d'avoir ainsi plusieurs niveaux de conditions de compilation.

  7. #7
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Citation Envoyé par Josiane22 Voir le message
    Du coup, je perd l'intéret de la chose puisque je compile des choses qui ne sont pas utiles... Et puis, mon programme est suffisamment compliqué, je n'ai pas trop envie de rajouter autant de ligne de code que de macro non utilisées...
    Je ne sais pas quel compilateur tu utilises, mais un truc qui sert à rien dans le code sera occulté par le compilateur en mode release.

    PS: à vérifier quand même au vu du static...

    PS2: (c'est mon opinion à moi seul) les macros en tant que fonction c'est le mal absolu. C'est pas débuggable, c'est pas maintenable, c'est le bordel d'un compilateur à un autre, bref ça devrait pas exister (nous sommes des développeurs, pas des scripteurs). Il y a les templates, les inline, les forceinline, c'est exactement pareil et sans les défauts. De plus en tant que fonction inline ou template il n'y aurait plus ce warning...

    PS3: (après lecture complète des messages) On te demande de retirer les warnings sans modifier le code en profondeur. Je pense que la prochaine étape sera de te demander que le logiciel fasse le café en changeant une seule ligne de code...
    Tu dois expliquer que le père Noël n'existe pas...

    PS4: Comme l'a signalé Bousk, sous visual studio tu as les #pragma warning. N'y a-t-il pas un équivalent sous gcc ?

    Citation Envoyé par Bousk;7214374
    Tu peux masquer le warning (c'est un simple pragma que [URL="https://www.google.com/search?q=hide+warning+message+C&aq=f&oq=hide+warning+message+C&aqs=chrome.0.57j0.7342j0&sourceid=chrome&ie=UTF-8"
    Google te donnera en ~1s[/URL])
    >> C'est je trouve un mauvais choix.
    C'est un très mauvais choix en effet lorsque tu compiles ton projet à toi. Par contre lorsque tu compiles des projets tel que ffmpeg ou openframeworks, tu es vraiment content que ça existe.

  8. #8
    Membre éprouvé Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Par défaut
    Rebonjour,

    Citation Envoyé par Josiane22
    Tu pourrais m'expliquer un peu ce que fais cette ligne?
    Laquelle ? Celle-là:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    static double __attribute__((__unused__)) truc;
    Citation Envoyé par Josiane22
    De ce que j'ai compris, ca veux dire en gros "déclare truc mais attention, je sais que truc ne sera pas toujours utilisé. Donc ne me le signale pas à chaque fois...". c'est ça?
    C'est exactement ça, voir ici
    Citation Envoyé par Josiane22
    Si oui, quelle différence entre ça et une option de compilation qui ne m'afficherais pas les warning.
    La différence c'est que l'attribut ne s'applique qu'a la variable en question, et ne désactive le warning que pour ces variables, pas pour les variables qui ne sont pas marquées avec cet attribut. L'option de compilation, elle, désactivera ce warning pour toutes les variables.
    Citation Envoyé par Josiane22
    J'ai un peu peur de cacher mon problème au lieu de le supprimer
    Toute la question est là, est-ce un problème ? Mais il me semble que ton but principal (compte tenu des contraintes que tu as) est justement de masquer ce problème pour pouvoir te concentrer sur les autres.

    Pour revenir sur le pourquoi le programmeur a écrit un tel code:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    static double truc;
    #define TOTO(a) ((truc=(a)) == 0.0 ? 0.0 : 2*truc)
    Ça évite la répétition des effets de bords (voir cette FAQ C).
    Note que pour ce problème, g++ offre une extension:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    #define TOTO(a) ({ double truc=(a); truc == 0.0 ? 0.0 : 2*truc; })
    (Voir ici.)

    Cependant, la solution C++ à ce problème est d'utiliser des fonctions inline:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    inline double TOTO(double a) {return a == 0.0 ? 0.0 : 2*a;}
    (Les macros sont la solution C pour optimiser une « fonction » en supprimant l'appel de fonction, la solution C++ pour ça, c'est les fonctions inline.)
    Cette solution, en plus d'être du C++, me paraît compatible avec ta contrainte « je dois apporter un minimum de changement » (après, ça dépend de la quantité de telles macros).

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par nowahn Voir le message
    Cependant, la solution C++ à ce problème est d'utiliser des fonctions inline:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    inline double TOTO(double a) {return a == 0.0 ? 0.0 : 2*a;}
    (Les macros sont la solution C pour optimiser une « fonction » en supprimant l'appel de fonction, la solution C++ pour ça, c'est les fonctions inline.)
    Cette solution, en plus d'être du C++, me paraît compatible avec ta contrainte « je dois apporter un minimum de changement » (après, ça dépend de la quantité de telles macros).
    C++ ou pas, c'est le compilateur qui décidera au final s'il inline la méthode.
    Donc la seule vraie solution pour "l'inliner" c'est la macro qui remplacera effectivement l'appel par le code de la fonction en question.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Option pour voir les variable non utilisées ?
    Par lex13 dans le forum NetBeans
    Réponses: 13
    Dernier message: 25/08/2007, 12h57
  2. [VBA][02]Détection des variables non utilisées
    Par cluis dans le forum VBA Access
    Réponses: 1
    Dernier message: 22/03/2007, 10h20
  3. variable non reconnue dans une requête sql
    Par sanatou dans le forum C++
    Réponses: 3
    Dernier message: 13/12/2006, 17h43
  4. Remonter warnings sur variables non utilisées
    Par titomcmoi dans le forum MFC
    Réponses: 2
    Dernier message: 30/05/2006, 12h42
  5. nommage de cellule et utilisation dans macro
    Par tritri38 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/04/2006, 16h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo