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 :

[C++] define et static


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut [C++] define et static
    Bonjour,

    je viens d'hériter d'un code et je remarque les lignes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // fichier toto.c
     
    static float sqrarg;
     
     
    // fichier toto.h
    #define SQR(a) 		((sqrarg = (a)) == 0.0 ? 0.0 : sqrarg * sqrarg)
    Quel est l'interêt de tout cela?
    Y a t'il une raison a toute cette "complication"?

    Ne peut on pas plutot faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define SQR(a) 		(a) a * a

    Merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Une façon bien sale de ne pas évaluer deux fois le paramètre a.
    En vrai C++ (note que ton code est en C) on ferait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename T>
    inline T Sqr(T a)
    {
        return a * a;
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut
    Une façon bien sale de ne pas évaluer deux fois le paramètre a.
    C'est vrai. Mais tu fais une affectation de plus...
    Est ce horrible d'évaluer un paramètre 2 fois?

    Oui ce code est du C compilé en C++. J'aurai peut-etre du aller sur le forum C...

    Pour toi la bonne methode est celle du template?

    Quel est la difference entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template <typename T>
    inline T Sqr(T a)
    {
        return a * a;
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define SQR(a) 		(a) a * a
    hormis le langage?

    Merci!

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par vince3320
    Oui ce code est du C compilé en C++.
    Très mauvais. Tu dois corriger cela immédiatement.
    Citation Envoyé par vince3320
    Quel est la difference entre <snip> et <snip> hormis le langage?
    Si tu fais SQR(a++), tu peux avoir une surprise.
    Avec Sqr(a++), aucun problème.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut
    Très mauvais. Tu dois corriger cela immédiatement.
    Je dois compiler en C++...
    Pourquoi est ce si mauvais?

    Je pose beaucoup de questions...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Le C n'est pas un sous-ensemble du C++.

    Autant une bonne partie des headers fait partie du sous-ensemble commun aux deux langages, autant le code C lui-même ne doit pas approcher un compilateur C++: Il faut toujours séparer en deux fichiers source.

    Bref, toto.h peut sûrement être inclus en C++, mais pas toto.c.
    De plus, je me méfie des headers qui utilisent une variable globale statique: Cela signifie généralement qu'ils sont dédiés au fichier source où ladite variable globale est déclarée, et que cette partie du header (voire le header entier) devrait être directement dans le fichier source.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Différence entre #define et static const int
    Par memoire.ph dans le forum Débuter
    Réponses: 6
    Dernier message: 02/04/2012, 01h05
  2. static const, namespace ou #define ?
    Par Awakening dans le forum Langage
    Réponses: 10
    Dernier message: 21/10/2011, 11h02
  3. Mais que fait static ???
    Par elsargento dans le forum C
    Réponses: 4
    Dernier message: 25/09/2003, 09h55
  4. define avec GCC.
    Par vagabon dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 12/06/2003, 14h04
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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