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 :

Différences entre #define et const


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Juin 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 36
    Points : 42
    Points
    42
    Par défaut Différences entre #define et const
    Bonjour,

    Je débute un peu en C et je n'ai pas bien compris la différence entre

    #define C 55.0;

    et

    const double C=55.0;


    Dans quels cas vaut-il mieux utiliser l'un ou l'autre ??
    Merci pour vos éclaircissements

  2. #2
    Débutant Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par Tittom
    Bonjour,
    Je débute un peu en C et je n'ai pas bien compris la différence entre
    #define C 55.0;
    et
    const double C=55.0;
    Il me semble que const ... est en fait une variable en lecture seule, et qui en passant par des pointeur peu etre modifié quand meme!!!(graves erreur par la suite surement).
    Alors que define, doit vraiement etre une constante;
    Enfin a verifier.
    Prenez le temps d'aller vite...

    Programme sous Windows, en C avec Code::Blocks, en Java JRE 1.6. avec Eclipse, en PHP/HTML/CSS avec Dreamweaver CS5 ou NotePad++ et en VBA sous avec Access 2010, Excel 2010, Word 2010 et Outlook 2010.

  3. #3
    Débutant Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par Tittom
    Dans quels cas vaut-il mieux utiliser l'un ou l'autre ??
    Merci pour vos éclaircissements
    A mon avis utilise sans aucun doute DEFINE (en plus si besoin est de modifier, c'est en haut du document donc pratique
    (il se pourais qu'il y ait un probleme au niveau de ta constante, si tu veux choisir char ou int etc...)
    Prenez le temps d'aller vite...

    Programme sous Windows, en C avec Code::Blocks, en Java JRE 1.6. avec Eclipse, en PHP/HTML/CSS avec Dreamweaver CS5 ou NotePad++ et en VBA sous avec Access 2010, Excel 2010, Word 2010 et Outlook 2010.

  4. #4
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    La question sur la difference entre const et #define est souvent posee. Ce sont deux concepts differents.
    1. #define definit des constantes au moment de la compilation. Elle est geree par le preprocesseur.
    2. #define ne definit pas directement une variable
    3. const qualifie une variable comme etant 'en lecture seule', i.e. sa valeur n'est pas sensee etre modifiee. Comme toute variable, elle possede un type et occupe un emplacement memoire (i.e. on peut en prendre l'adresse et stocker cette adresse dans un pointeur).

    Donc, utilise const pour profiter du type checking et pointer vers la variable cree. Utilise #define dans les cas ou une const ne convient pas, comme pour dimensionner un tableau ou lister les cas possibles d'un switch.

  5. #5
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par DaZumba
    La question sur la difference entre const et #define est souvent posee. Ce sont deux concepts differents.
    1. #define definit des constantes au moment de la compilation. Elle est geree par le preprocesseur.
    2. #define ne definit pas directement une variable

    exact, d'ailleurs cela pose parfois des problèmes incompréhensibles pour ceux qui l'ignorent

    du genre quelle la différence entre :
    et
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    encore raté, c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define sqr(x) ((x)*(x))
    Et encore, attention aux effets de bord: c'est comme pour min et max...
    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.

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Médinoc
    encore raté, c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define sqr(x) ((x)*(x))
    Et encore, attention aux effets de bord: c'est comme pour min et max...
    En effet:
    #define sqr(x) (x)*(x)
    ...
    1./sqr(2) => 1./(2)*(2) =>1. != 1./(2*2)=0.25
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  8. #8
    Membre éprouvé Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Points : 1 210
    Points
    1 210
    Par défaut
    Citation Envoyé par miron
    Il me semble que const ... est en fait une variable en lecture seule, et qui en passant par des pointeur peu etre modifié quand meme!!!(graves erreur par la suite surement).
    Alors que define, doit vraiement etre une constante;
    Enfin a verifier.
    Une variable en lecture seul, le terme n'est pas élégant.

    Ce qui est constant c'est le type dans ce cas.

    Je sais qu'en C++ on peut ecrire ceci
    Est-ce vrai aussi en c ???

  9. #9
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par seriousme
    En effet:
    #define sqr(x) (x)*(x)
    ...
    1./sqr(2) => 1./(2)*(2) =>1. != 1./(2*2)=0.25
    faudrait que je teste avant de parler
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  10. #10
    Débutant Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par gnto
    Une variable en lecture seul, le terme n'est pas élégant.
    Citation Envoyé par DaZumba
    const qualifie une variable comme etant 'en lecture seule'
    ...
    Peut etre mais je suis pas le seul...
    Prenez le temps d'aller vite...

    Programme sous Windows, en C avec Code::Blocks, en Java JRE 1.6. avec Eclipse, en PHP/HTML/CSS avec Dreamweaver CS5 ou NotePad++ et en VBA sous avec Access 2010, Excel 2010, Word 2010 et Outlook 2010.

  11. #11
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par gnto
    Ce qui est constant c'est le type dans ce cas.
    Peux-tu donner un exemple d'une variable de type non-constant ?
    const double var; ou double const var; signifie la meme chose.
    Pour un pointeur, il y a en effet une finesse: on peut vouloir que le pointeur _et_ sa valeur (i.e. l'adresse d'une autre variable de meme type) soient constants. Donc const double *ptr; et const double const *ptr; ne signifient pas exactement la meme chose.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si : le deuxième const est du mauvais coté de l'étoile.
    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.

  13. #13
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Les closes de constances, ne sont pas toujours bien gérées par les compilateurs. Par exemple sous gcc 3.2, le fait d'outrepasser le const ne donne que des avertissements, et le code fonctionne quand même!

    C'est la valeur qui est contante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const type variable = valeur;
     
    const int i = 3; //On ne peut plus changer i
    C'est la valeur pointée qui est contante on peu changer l'adresse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const type variable = valeur;
    const type * pointeur = &variable;
     
    const int i = 3; /*ou*/ int i=3; 
    const int j = 2;
    cont int * p_i = &i; //on ne peut plus changer la valeur de i via le pointeur
    p_i = &j;            //possible
    C'est l'adresse qui est constante on peut changer la valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type variable = valeur;
    type * const pointeur = &variable;
     
    int i = 3;
    int * const p_i = &i; //Le pointeur ne peut plus pointer sur un autre entier
    *p_i = 4;             //possible
    Tout est constant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const type variable = valeur; /*ou*/ type variable1 = valeur.
    const type * const pointeur = &variable; //On ne peut plus rien modifier via le pointeur

  14. #14
    Membre éprouvé Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Points : 1 210
    Points
    1 210
    Par défaut
    T'as bien appris ta leçon béber sera fier de toi !!!

    ma question était si cette écriture barbar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const type const pointer
    pouvait s'écire en C apparement oui !!

    et celle la peut-elle s'écrire en C ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type function (parameter) const ;

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const type * const pointer
    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.

  16. #16
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    En effet ça peut s'écrire en C. (comme le dit medinoc, pense à l'étoile avant le const).

    Par contre une fonction const n'a de sens qu'en c++, puisque cela signifie qu'elle ne modifie pas les données membres de la classe à laquelle elle appartient.

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Tittom
    Je débute un peu en C et je n'ai pas bien compris la différence entre
    et
    Dans quels cas vaut-il mieux utiliser l'un ou l'autre ??
    Déjà, c'est
    #define n'est pas une instruction C (donc pas de ';'), mais une instruction 'préprocesseur', c'est à dire un outil de substitution de texte. A chaque fois qu'il y aura C dans le texte, il sera remplacé par l'expression correspondante 55.0.

    Alors que
    définit une variable à lecture seule (non modifiable) nommée C et donc la valeur est 55.0.
    On utilise la variable si on a besoin de l'adresse de celle-ci. Sinon, le define suffit.
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par DaZumba
    Utilise #define dans les cas ou une const ne convient pas, comme pour dimensionner un tableau ou lister les cas possibles d'un switch.
    Dans le dernier cas, ce doit être un type int exclusivement.
    Pas de Wi-Fi à la maison : CPL

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par gnto
    Une variable en lecture seul, le terme n'est pas élégant.
    "variable en lecture seule"
    Peu importe, c'est la réalité. Tu peux dire "variable non modifiable" si tu préfères.
    Ce qui est constant c'est le type dans ce cas.
    Ca n'a aucun sens.
    • Rien ici n'est constant (une expression constante en C, c'est quelque chose de bien précis. 'const' n'a rien à voir avec conastsnt. C'est une façon curieuse et raccourcie d'écrire 'readonly'.
    • La variable qui est non modifiable.
    Je sais qu'en C++
    En quoi ?
    on peut ecrire ceci
    Est-ce vrai aussi en c ???
    En C, ça n'a aucun sens. Tu veux peut être dire :
    Là, c'est autre chose...
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par gnto
    [SIZE="1"]ma question était si cette écriture barbar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const type const pointer
    pouvait s'écire en C apparement oui !!
    Non. Double qualification -> erreur.
    et celle la peut-elle s'écrire en C ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type function (parameter) const ;
    Non. Pas du C.
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/01/2014, 00h04
  2. 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
  3. différences entre const double& et double
    Par BigNic dans le forum Langage
    Réponses: 8
    Dernier message: 30/09/2011, 17h20
  4. Différence entre static et const?
    Par Coby11 dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 08/04/2011, 13h04

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