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 efficace les macros ?


Sujet :

C

  1. #1
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut c efficace les macros ?
    bonjour,
    J'ai une ligne de code en plein dans une fonction qui est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define CHAR_PER_LINE 25
    Normalement ce genre de trucs est declare haut dans un programme.
    N'est-il pas mieux de simplement declarer un int charperline = 25 ?
    Est-ce plus efficace de faire un define ?

  2. #2
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 110
    Points : 99
    Points
    99
    Par défaut


    Il y a une difference entre les 2 :

    #define est une constante donc elle ne doit pas changer durant le programme
    int .. est une variable qui peut changer dans le programme

    C'est vrai que c'est pas très logique de la déclarer dans du code
    Pour voir qu'il fait noir, on n'a pas besoin d'être une lumière.

    Il faut cueillir les cerises avec la queue. J'avais déjà du mal avec la main !

  3. #3
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    ha oui mais dans ce cas quel est le mieux ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    #define CHAR_PER_LINE 25
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    const int charperline = 25

  4. #4
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    et peux t-on faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const int var = 25;
    char line[var];
    ou doit on faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    #define VAR 25
    char line[VAR];
    merci

  5. #5
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Pour moi, une macro ça contient un appel de fonction.

    Si tu fais un define, la constante qui en résulte est accessible par toutes les fonctions de ton programme.
    les 'const int' ne le sont pas.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  6. #6
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Citation Envoyé par graphicsxp
    et peux t-on faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const int var = 25;
    char line[var];
    ça me paraît déconseillé, mais il semble que mon compilateur avec l'option -Wall ne dise rien ...

    ou doit on faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    #define VAR 25
    char line[VAR];
    merci
    ça, je suis quasiment sûr que c'est bon.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2002
    Messages : 38
    Points : 61
    Points
    61
    Par défaut
    Avec un
    tu remplaces, enfin le préprocesseur, dans le code toutes les chaîne TOTO par 25 (comme si dans NotePad tu faisais Edition/Remplacer "TOTO" par "25") et ensuite c'est compilé. La valeur 25 est inscrite en dur dans l'exécutable.

    Alors que si tu fait un
    Lorsque que tu exécute ton programme, il alloue de l'espace mémoire pour y mettre 25. C'est de l'espace alloué inutilement.

    Je sais pas si je suis très clair : : j'en doute

    En tout cas dans les exemples cité plus haut, l'utilisation de DEFINE me semble plus approprié.
    -Magic-

  8. #8
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Salut,

    Par contre, il peut y (parfois) avoir parfois un avantage à utiliser

    const int TOTO=25;

    c'est que l'on dispose ainsi de controles sur les types utilisés.

    En effet, TOTO défini avec un #define n'est pas typé, alors que si l'on a un const int, le type est explicite et l'on peut obtenir des avertissements du compilateur pour une utilisation mal-à-propos.


    Le vrai danger du #define vient des macro-fonctions.

    En effet, un
    #define _2x(a) a + a
    Définit une macro-fonction qui double son paramètre.

    C'est cool, ça marche quand on fait
    int i=10, j ; j = _2x(i);
    aussi bien que quand on fait
    float f=10., g ; g = _2x(f);

    C'est valable pour tous les types "calculables".

    Mais s'il nous vient l'envie de faire (je sais, c'est bête, mais je l'ai vu !) :
    int i =10, j; j = _2x(i++);
    on a de grosses surprises sur la valeur de i en sortie.

    On devrait trouver 11, mais on obtient 12 avec la plupart des preproc/compilos.

    En effet, le a du #define est substitué partout par le paramètre effectif, et comme ça se passe avant la compilation, c'est "i++" qui est mis partout, et non son résultat. C'est donc comme si on avait écrit "i++ + i++" !!

    Le tout, c'est d'être prévenu !!!

    A+
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #define TOTO 23
     
    // et
     
    const int TOTO = 23;

    Les deux déclarations sont identiques au final. En effet, la norme autorise le compilateur à mettre en dur les variables const, pour peu qu'il ne soit jamais fais allusion à l'adresse de la variable.

  10. #10
    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 graphicsxp
    ha oui mais dans ce cas quel est le mieux ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define CHAR_PER_LINE 25
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const int charperline = 25
    C'est pas pareil. La macro est une substitution de texte. La valeur numérique est une expression constante de type int. Elle peut servir de dimension pour définir un tableau.

    La variable en lecture seule n'est pas une expression constante.
    Pas de Wi-Fi à la maison : CPL

  11. #11
    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 ggnore
    Pour moi, une macro ça contient un appel de fonction.
    Quoi ?
    Si tu fais un define, la constante qui en résulte est accessible par toutes les fonctions de ton programme.
    les 'const int' ne le sont pas.
    Ah ? Pourquoi donc ? Est-tu sûr de bien savoir de quoi tu parles ?
    Pas de Wi-Fi à la maison : CPL

  12. #12
    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 graphicsxp
    et peux t-on faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const int var = 25;
    char line[var];
    Ce code ne fonctionne qu'en C99 sous certaines conditions.
    ou doit on faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define VAR 25
    char line[VAR];
    Ce code est portable.
    Pas de Wi-Fi à la maison : CPL

  13. #13
    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 2Eurocents
    En effet, TOTO défini avec un #define n'est pas typé,
    C'est faux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define A 123 /* int */
    #define B 123u /* unsigned int */
    #define C 123l /* long */
    #define D 123ul /* unsigned long */
    #define E 12.3F /* float */
    #define E 12.3 /* double */
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Et dire que certains me traitent de pinailleur !!

    Bon, d'accord, je reformule :

    Lorsque l'on effectue des operations (arithmétique) en mixant avec d'autres types de données , l'information de type associée à l'écriture de la valeur du #define n'est pas toujours suffisante pour que le compilateur signale les transtypages hasardeux.

    A priori, avec un typage fort en const, le compilateur se plaint plus rapidement.

    Ceci dit, personnellement, je privilégie les #define pour les fichiers d'entête (pas de code ... que de la "nourriture pour préprocesseur") et j'utilise parfois les const dans mes fichiers de code.

    Mais je ne prétend pas non plus détenir la science infuse. Ce n'est qu'une de mes habitudes de programmation.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  15. #15
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 337
    Points : 130 282
    Points
    130 282
    Billets dans le blog
    1
    Par défaut
    En C89, const int ne déclare pas une constante, mais bien une variable non modifiable.

    La différence c'est qu'elle prendra en elle-même de la mémoire et que dans les calculs il y aura un accès mémoire pour lire la constante (sauf si le compilateur est suffisamment optimiseur pour savoir substituer). Donc, const int = perte de performance en général.

    C'est pour ça que je préfère les #define, ou, mieux, les enums, pour déclarer mes constantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    enum {
      CONSTANTE1 = 500,
      CONSTANTE2 = 600
    };
    L'avantage des enums c'est qu'il n'y a pas de risque de remplacement au mauvais endroit, et qu'il s'agit d'une réelle constante. L'inconvénient, c'est que la constante ne peut être qu'un int.

    En C++, const int déclare réellement une constante. En C99, je ne sais pas (si quelqu'un sait, je suis preneur ).
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  16. #16
    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 Anomaly
    En C++, const int déclare réellement une constante. En C99, je ne sais pas (si quelqu'un sait, je suis preneur ).
    Pareil qu'en C90. C'est une variable, et non une expression constante. Elle a une adresse.
    Pas de Wi-Fi à la maison : CPL

  17. #17
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 337
    Points : 130 282
    Points
    130 282
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Anomaly
    En C++, const int déclare réellement une constante. En C99, je ne sais pas (si quelqu'un sait, je suis preneur ).
    Pareil qu'en C90. C'est une variable, et non une expression constante. Elle a une adresse.
    D'accord, mais tu disais ici :

    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par graphicsxp
    et peux t-on faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int var = 25;
    char line[var];
    Ce code ne fonctionne qu'en C99 sous certaines conditions.
    Si la signification de const int n'a pas changé depuis l'ancienne norme, pourquoi ce code marcherait-il en C99, et quelles sont ces fameuses conditions ?
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  18. #18
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Anomaly
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par graphicsxp
    et peux t-on faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int var = 25;
    char line[var];
    Ce code ne fonctionne qu'en C99 sous certaines conditions.
    Si la signification de const int n'a pas changé depuis l'ancienne norme, pourquoi ce code marcherait-il en C99, et quelles sont ces fameuses conditions ?
    Ce n'est pas lie au changement de comportement du const mais au changement de comportement des tableau (j'ai oublie le nom exact du mecanisme).
    En C99, la taille d'un tableau n'est plus obligatoirement une expression constante.

  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 Anomaly
    Ce code ne fonctionne qu'en C99 sous certaines conditions.
    Si la signification de const int n'a pas changé depuis l'ancienne norme, pourquoi ce code marcherait-il en C99, et quelles sont ces fameuses conditions ?
    Ce qui change c'est la notion de VLA (Variable Length Array) qui accepte une variable. Si j'ai bien compris, un VLA ne peut exister que dans un bloc, et son adresse n'est pas transmissible à l'appelant. D'autre part, comme avec les variables automatiques, on a pas le moyen de savoir si la création d'un VLA s'est bien déroulée ou non.
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Anomaly
    Ce code ne fonctionne qu'en C99 sous certaines conditions.
    Si la signification de const int n'a pas changé depuis l'ancienne norme, pourquoi ce code marcherait-il en C99, et quelles sont ces fameuses conditions ?
    Ce qui change c'est la notion de VLA (Variable Length Array) qui accepte une variable. Si j'ai bien compris, un VLA ne peut exister que dans un bloc, et son adresse n'est pas transmissible à l'appelant. D'autre part, comme avec les variables automatiques, on a pas le moyen de savoir si la création d'un VLA s'est bien déroulée ou non.
    les VLA sont equivalent (en fonctionnalité, pas en syntaxe) à la fonction non standard, mais largement repandue alloca.

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

Discussions similaires

  1. [VBA][Word]Sauvegarder sans les macros
    Par Oui-Oui MB dans le forum VBA Word
    Réponses: 3
    Dernier message: 23/07/2007, 12h29
  2. Desactiver les macros excel
    Par Mystro dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/11/2005, 10h27
  3. Aide sur les macros Excel pour recopie auto de données
    Par nicoduhavre dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/11/2005, 08h38
  4. [macro] Automatiser les macros
    Par argv666 dans le forum Access
    Réponses: 6
    Dernier message: 08/11/2005, 17h37
  5. [VBA-E] ouvrir un fichier .xls sans executer les macro
    Par lae_t2 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/01/2003, 17h07

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