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 :

[const] #define vs const


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 100
    Points : 49
    Points
    49
    Par défaut [const] #define vs const
    Bonjour

    quelle est l adifference pour la delaration des constantes chaines de caracteres entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define CHAINE "bonjour"
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char chaine [] = "bonjour"
    en terme d'utilsation memoire ?

    de meme pour les constantes numerique


    et

  2. #2
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Points : 451
    Points
    451
    Par défaut
    Salut !

    La différence est dans l'utilisation qu'on en fait : #define est utilisé pour des valeurs globales en général, qu'on ne veut pas trafiquer, toucher et qui sont les même quelque soit la chose que fait le programme.
    const, c'est juste pour dire que la valeur de la variable n'est pas modifiable.

    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #define N 100
    void fonction_bidon(const char *chaine)
    {
      int i ;
      for( i = 0; i < N; i++)
      printf("%s\n",chaine);
    }
     
    int main(void)
    {
     ...
     fonction_bidon("Coucou");
     
    ...
    }
    A+
    "Cultiver les sciences et ne pas aimer les hommes, c'est allumer un flambeau et fermer les yeux." Proverbe chinois

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    bonjour

    #define est une directive pré-compilation. Donc #define MAX 10 donne que toute occurence de MAX dans le source sera remplacé par la valeur 10. Donc rien en mémoire

    const char bonjour[]"Bonjour" défini un tableau constant en mémoire ( zone statique ), le tableau est présent en mémoire mais est uniquement en mode lecture.

    Je sais pas si ca t'avance ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    const char bonjour[]"Bonjour" défini un tableau constant en mémoire ( zone statique ), le tableau est présent en mémoire mais est uniquement en mode lecture.
    Juste un petit détail,

    Occupera aussi de la place mémoire....

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Dans le cas d'utilisaton de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define CHAINE "bonjour"
    je me demande si a chaque fois que le compilateur va retrouver la chaine "bonjour" dans le code ( resultat de preprocesseur) il y aura une allocation statique de 8 caracteres ( sizeof("bonjour") )?

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par fearyourself
    const char bonjour[]"Bonjour" défini un tableau constant en mémoire ( zone statique ), le tableau est présent en mémoire mais est uniquement en mode lecture.
    Juste un petit détail,

    Occupera aussi de la place mémoire....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define TXT "Bonjour"
     
    printf("%s", TXT);
    La place que cela prend se trouve dans l'executable mais pas en mémoire vive...
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  7. #7
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    je me demande si a chaque fois que le compilateur va retrouver la chaine "bonjour" dans le code ( resultat de preprocesseur) il y aura une allocation statique de 8 caracteres ( sizeof("bonjour") )?
    Je ne pense pas que cela fait partie de la norme mais sur gcc 3.4.4, la chaîne se retrouvera une seule fois en mémoire...



    La place que cela prend se trouve dans l'executable mais pas en mémoire vive...
    Sauf si je me trompe entièrement mais lorsqu'un programme est exécuté, le code du programme est chargé en mémoire vive y compris les chaînes de caractères "statiques"...

    Il est possible que ce soit dépendant de l'OS mais sur ce point, cela m'étonnerait...

    Jc

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    je pense que le plus sur pour les constantes chaines de caracters d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char buffer[] = "bonjour"

  9. #9
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,
    reprenons depuis le début

    Premier cas :
    La chaîne "bonjour" est stockée dans le fichier exécutable (ce sont ces chaînes que l'on voit lorsque l'on ouvre un exécutable en tant que fichier texte).
    Ensuite lors de son utilisation, par exemple :
    Le préprocesseur remplacera ceci par :
    Qui renvoi l'adresse de la chaîne [1] à la fonction puts.

    Deuxième cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char chaine [] = "bonjour"
    On commence par créer une zone mémoire de 8 bytes dans laquelle est recopiée la chaîne "bonjour" (cf premier cas pour ceux qui n'ont pas suivie).
    Dans ce cas, il n'est pas nécessaire de déclarer le contenu de la variable chaine constant, cependant cela est fortement conseillé dans l'exemple ci dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char *chaine = "bonjour"
    Puisque cette fois ci, on ne réserve pas d'espace mémoire, on se contente de stocker dans chaine l'adresse de la chaîne "bonjour" [1] qui peut être dans une zone de mémoire en lecture seule.

    Les chaînes de caractères en C

    ---
    [1] Lorsque l'exécutable est chargé en mémoire, la partie contenant les données l'est aussi par conséquent les chaînes de caractères stockées dans le fichier se retrouvent donc en mémoire, c'est cette adresse dont il est question ici.

  10. #10
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Citation Envoyé par gege2061
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char chaine [] = "bonjour"
    On commence par créer une zone mémoire de 8 bits
    64 bits en fait ... ou 8 octets

    Smortex

    Les FAQ Assembleur - Linux
    In The Beginning Was The Command Line Neal Stephenson

  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
    Il y a pas mal de confusion dans ce post. Un #define pre-processeur ne declare rien du tout. C'est juste un "trouver-remplacer" qui sera execute sur le code source. Savoir si de la memoire sera allouee depend entierement de l'utilisation de la valeur definie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define STRING "This is a string"
    ...
    char string[] = STRING;
    va evidemment occuper de la memoire.

    De la meme facon,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define LENGTH 10
    ...
    char string[LENGTH];
    ne va pas allouer de la memoire pour la variable LENGTH, puisqu'elle n'existe pas!

  12. #12
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    mais de point de vue de la taille de l'executable

    est-ce que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     puts("bonjour");
    puts("bonjour");
    puts("bonjour");
    prend plus ou moins d'espace que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    const char* chaine = "bonjour";
    puts(chaine);
    puts(chaine);
    puts(chaine);

  13. #13
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Exactement la même taille mais cela dépend du compilateur en fait. Est-il assez intelligent pour voir qu'il y a plusieurs fois la même chaîne de caractère?

    Généralement oui

  14. #14
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Smortex
    Citation Envoyé par gege2061
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char chaine [] = "bonjour"
    On commence par créer une zone mémoire de 8 bits
    64 bits en fait ... ou 8 octets
    Nan désolé, je voulai dire bytes c'est corrigé.

    Citation Envoyé par fearyourself
    Exactement la même taille
    Ah bon dans le second cas, on déclare une variable de taille sizeof (char *) après si le compilateur s'amuse à faire des optimisations, forcement on ne va pas s'en sortir

  15. #15
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par gege2061
    Citation Envoyé par fearyourself
    Exactement la même taille
    Ah bon dans le second cas, on déclare une variable de taille sizeof (char *) après si le compilateur s'amuse à faire des optimisations, forcement on ne va pas s'en sortir
    Je ne suis pas convaincu... La taille de l'exécutable restera inchanger... Du moins c'est ce que dit mon petit doigt...

    C'est la fin de la journée, je vais y réflechir...

  16. #16
    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
    Il faut faire des tests, comme d'habitude. Dans mon cas (gcc sous Linux RedHat et cc sous HP-UX), l'executable genere est de meme taille et identique pour les deux facons proposees. Il semble donc que le compilateur factorise le code de facon a n'utiliser qu'une seule chaine dans le cas des puts("bonjour").

    Mais je me demande bien pourquoi le posteur original se pose ce genre de questions. C'est pour faire une demo en moins de 64k?

  17. #17
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par fearyourself
    La taille de l'exécutable restera inchanger...
    J'était partie sur la taille lors de l'exécution
    Au niveau du fichier lui même, déjà on s'écarte du sujet de ce forum puisque tous les systèmes ne possèdent pas la notion de fichier.

    Et comme le dis DaZumba
    Mais je me demande bien pourquoi le posteur original se pose ce genre de questions. C'est pour faire une demo en moins de 64k?
    J'aimerai aussi connaitre le but de cette question, si c'est pour gagner quelque ko sur un programme destiné à tourner sous Windows XP, c'est inutile.

  18. #18
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Non c'est pour un systeme embarqué qui tourne sous linux

  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 Re: [const] #define vs const
    Citation Envoyé par Mokhtar BEN MESSAOUD
    quelle est l adifference pour la delaration des constantes chaines de caracteres entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define CHAINE "bonjour"
    Pour le moment, ça ne définit qu'une substitution de caractères. Tant qu'on utilise pas la macro, aucune mémoire n'est réservé, aucun objet n'est crée...
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char chaine [] = "bonjour"
    Un espace mémoire non modifiable et initialisé est crée. C'est une tableau de type char. Il peut être de portée locale ou statique. Il peut être persistant ou non. La taille de l'objet crée est 'sizeof chaine' bytes. Il dispose d'une adresse.
    en terme d'utilisation memoire ?

    de meme pour les constantes numerique
    Pour le moment, ça ne définit qu'une substitution de caractères. La valeur numérique équivallente est une expression constante. Elle n'a n'a pas d'adresse et n'occupe aucune place en mémoire. On parle aussi de 'valeur immédiate'.
    et
    Un espace mémoire non modifiable et initialisé est crée. C'est un objet de type int Il peut être de portée locale ou statique. Il peut être persistant ou non. La taille de l'objet crée est 'sizeof valeur' bytes. Il dispose d'une adresse. Ce n'est pas une expression constante.
    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 hegros
    const char bonjour[]"Bonjour" défini un tableau constant en mémoire ( zone statique ),
    ou automatique (locale).
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. POO, constantes différence Define et Const
    Par SuperArbre dans le forum Langage
    Réponses: 4
    Dernier message: 14/05/2012, 15h05
  2. deux variables const et pas const
    Par contremaitre dans le forum C
    Réponses: 4
    Dernier message: 15/04/2008, 16h27
  3. Réponses: 13
    Dernier message: 02/04/2007, 11h04
  4. const char et const unsigned char
    Par moon93 dans le forum C
    Réponses: 8
    Dernier message: 04/08/2006, 15h59
  5. Différences entre #define et const
    Par Tittom dans le forum C
    Réponses: 19
    Dernier message: 01/06/2006, 13h48

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