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érence entre #define et static const int


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2012
    Messages : 24
    Points : 15
    Points
    15
    Par défaut Différence entre #define et static const int
    salut tout le monde
    j'ai une petite question à vous poser la voilà :
    Quelles différences il y a t-il entre les deux constantes MAX1 et MAX2 définies de la façon suivante ?
    – #define MAX1 100
    – static const int MAX2 = 100
    elle parait que c'est une question de cours mais je trouve pas la bonne réponse, je vous serai très reconnaissant de m'indiquer la différence
    cordialement

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    La différence c'est que MAX1 est une macro et va donc être substitué partout où elle apparaitra, donc :

    sera remplacé par :

    Tandis que MAX2 est une variable normal comme toute les autres que tu utilises sauf que tu ne peux pas l'utiliser (bien que ça soit faisable quand même avec un const_cast : ce qui prouve que ça occupe bien une case mémoire que tu peux affecter).

    Perso, les static const ... je les utilise à l'intérieur des classes C++ pour définir des variables de classe. Tandis que les define je les utilise plutôt quand ils ne sont rattachés à aucun contexte particulier.

  3. #3
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    C'est en effet la base

    #define MAX1 100 est traité par le préprocesseur. Tout se passe comme si tu disais "Avant de compiler, parcours mon code, et a chaque fois que tu vois MAX1, tu remplaces par 100". Donc c'est exactement comme si tu avais écrit 100 a la place de MAX1 partout. C'est plus rapide, mais par contre tu ne peux pas le mettre dans un namespace, et tu ne pourras plus utiliser MAX1 nulle part ailleurs dans ton code pour faire autre chose, sinon ca sera remplacé par 100.

    static const int MAX2 = 100 est une variable que tu définis à la valeur 100. Elle sera évaluée pendant que le code tournera, et sera donc un peu plus lente à gérer. C'est comme utiliser une variable globale, elle occupera une place en mémoire pendant toute la durée de ton programme, et quand tu l'utiliseras elle sera copiée à l'emplacement que tu veux pendant l'exécution. Mais elle permet d'utiliser toute l'organisation du langage, elle peut être mise dans une classe ou un namespace pour en préciser le contexte. C'est plus propre.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,
    Citation Envoyé par Rewpparo Voir le message
    C'est en effet la base

    #define MAX1 100 est traité par le préprocesseur. Tout se passe comme si tu disais "Avant de compiler, parcours mon code, et a chaque fois que tu vois MAX1, tu remplaces par 100". Donc c'est exactement comme si tu avais écrit 100 a la place de MAX1 partout. C'est plus rapide, mais par contre tu ne peux pas le mettre dans un namespace, et tu ne pourras plus utiliser MAX1 nulle part ailleurs dans ton code pour faire autre chose, sinon ca sera remplacé par 100.

    static const int MAX2 = 100 est une variable que tu définis à la valeur 100. Elle sera évaluée pendant que le code tournera, et sera donc un peu plus lente à gérer. C'est comme utiliser une variable globale, elle occupera une place en mémoire pendant toute la durée de ton programme, et quand tu l'utiliseras elle sera copiée à l'emplacement que tu veux pendant l'exécution. Mais elle permet d'utiliser toute l'organisation du langage, elle peut être mise dans une classe ou un namespace pour en préciser le contexte. C'est plus propre.
    En fait, meme s'il n'y a pas moyen d'accéder à une valeur définie avec #define parce que l'on ne dispose pas d'un identifiant pour ce faire, il faut bien se dire que le define ne fait que permettre le remplacement de l'identifiant qu'il défini par l'équivalent sous la forme (dans le cas présent) d'une valeur littérale.

    Il serait tout à fait illogique de croire que, sous prétexte que c'est un define, on ne trouve pas dans le code une succession de bits qui représente la valeur 100... Bien au contraire, on la retrouvera partout où MAX1 aura été utilisé (vu que, comme il l'a déjà été signalé, le préprocesseur remplacera chaque occurence de MAX1 par... la valeur littérale 100 )

    Le problème, c'est qu'un défine "court-circuite" complètement la vérification de type, car rien ne resemble plus à la valeur littérale 100 que ... la valeur littérale 100 : Le compilateur ne pourra pas s'assurer que tu n'essaye pas de comparer une variable avec une valeur en dehors de la fourchette de valeur représentable par ta variable.

    Ainsi, si tu écrit un #define MAX3 1000, tu n'auras sans doute pas trop de problème... tant que tu te limitera à utiliser un type capable de représenter la valeur 1000, mais donc... à l'exclusion du char (qui, typiquement, permet de ne représenter que 255 valeurs différentes)

    La définition de MAX2 sous la forme de static unsigned int MAX2=0va par contre créer une variable globale (au minimum au fichier ) à laquelle il est effectivement possible d'accéder au niveau de la mémoire (étant donné que l'on dispose de l'identifiant permettant de ce faire), mais va, en plus permettre au compilateur de vérifier que MAX2 et la variable avec laquelle tu essaye de la comparer présentent une fourchette de valeur permettant au minimum de représenter la valeur de MAX2.

    S'il est bien réglé, et que tu essaye de comparer MAX2 à un type non signé ou à un type présentant une fourchette de valeurs inférieure (typiquement à un short ou à un char ), voire à un réel (float ou double), tu as de grandes chances d'obtenir un avertissement te disant que la comparaison que tu es occupé à tenter risque de te faire perdre en précision, d'être toujours fausse

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2012
    Messages : 24
    Points : 15
    Points
    15
    Par défaut
    bonsoir
    je vous remercie pour vos éclairages vraiment ça réchauffe le coeur,je veux juste savoir pourquoi on ne peux pas utiliser la première déclaration dans un namespace
    merci d'avance

  6. #6
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonsoir,

    Citation Envoyé par memoire.ph Voir le message
    je veux juste savoir pourquoi on ne peux pas utiliser la première déclaration dans un namespace
    Les macros ignorent le concept de namespace, que tu fasses un define dans un namespace où ailleurs, ça a le même effet.

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Rewpparo Voir le message
    #define MAX1 100 est traité par le préprocesseur. [...] C'est plus rapide
    Faux. Mettre un define à la place d'une constante connue à la compilation n'est pas plus rapide. C'est équivalent en terme de vitesse, et, comme tu l'as dit, très inférieur sur tous les autres critères.

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

Discussions similaires

  1. Différence entre static et const?
    Par Coby11 dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 08/04/2011, 13h04
  2. Quelles sont les différences entre les types char et int ?
    Par RayBradbury dans le forum Débuter
    Réponses: 3
    Dernier message: 27/03/2011, 16h10
  3. Différence entre quelques Methodes Static en java
    Par Echap dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 14/03/2011, 15h01
  4. Différences entre #define et const
    Par Tittom dans le forum C
    Réponses: 19
    Dernier message: 01/06/2006, 13h48
  5. Différence entre String et Int
    Par Alchimist dans le forum Langage
    Réponses: 6
    Dernier message: 05/04/2006, 11h00

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