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 :

Utilisation des macros: bien ou mal?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut Utilisation des macros: bien ou mal?
    Bonjour à tous,

    Je viens ici avec un sujet un peu général, au sujet duquel votre avis m'intéresse. J'ai lu dans un post sur le groupe usenet comp.lang.c qu'il fallait le plus possible limiter l'utilisation du préprocesseur C. Qu'en pensez-vous?

    Je pense que le problème majeur vient de la lisibilité du code, car on peut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #if defined(UNE_MACRO)
    /*...un bout de code ...*/
    #endif
    On peut alors définir UNE_MACRO à la compilation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -DUNE_MACRO -c -o monfichier.o monfichier.c
    Et là c'est une horreur de suivre le chemin d'exécution du code, lorsque la taille du projet devient importante.

    En revanche, pour toute macro définie dans un fichier d'entête, je ne vois pas (avec mes yeux de débutant) pourquoi l'usage du préprocesseur ne serait-elle pas conseillée:
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    /* entete.h */
    #ifndef H_TC_ENTETE_20061109111233
    #define H_TC_ENTETE_20061109111233
     
    #define UNE_MACRO
     
    #endif /* guard */
     
    /* main.c*/
    #include <stdio.h>
    #include <stdlib.h>
    #include "entete.h"
     
    int main(void)
    {
        #ifdef UNE_MACRO
        printf("SUper, UNE_MACRO est définie!\n");
        #endif
     
        #ifndef UNE_AUTRE_MACRO
        printf("Eh oui, UNE_AUTRE_MACRO n'est pas définie!\n");
        #endif
     
        return EXIT_SUCCESS;
    }
    Suivre l'exécution de ce code ne pose pas de problème particulier, comme d'ailleur l'utilisation de MACRO définies dans la bibliothèque standard. Où est donc le problème avec le préprocesseur? J'attend vos commentaires et retour d'expérience avec beaucoup d'intérêt. Faut-il préférer l'utilisation de fonction inline (C99) plutôt que l'usage de macros? Beaucoup de programmeurs hésitent encore à utiliser C99 pour des questions de portabilité.

    Meilleures salutations et merci pour tout

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Tu melanges un peu deux choses : compilation conditionnelle et macros pouvant etre remplacees par des fonctions inline.

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Alors, sortons la compilation conditionnelle qui un cas particulier de l'utilisation du préprocesseur C et concentrons-nous sur l'usage de ce même préprocesseur pour définir des macros uniquement. En quoi est-il préférable d'utiliser une fonction inline plutôt qu'une macro? La spécification des directives du préprocesseur C fait partie de la norme et donc, en principe, la définition de macros ne présente aucun problème de portabilité est encore moins de performance.

    Je pense à deux aspects en faveur des fonctions inline C99:

    - Le compilateur a le choix de ne pas rendre la fonction inline si le corps de cette dernière est trop long (trop d'instructions). Il s'agit donc d'une question je présume d'optimisation de la taille de l'exécutable.
    - L'écriture d'une macro dans les règles de l'art demande quelques précautions:
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define MUL(x, y) (x*y) /* MUL(3+5, 4) sera traduit par 3 + 5 * 3 */
     
    alors que
     
    #define MUL(x, y) ( (x) * (y) ) /* protège contre ce genre de mésaventures source de bugs */
    Est-ce pour cette raison qu'on déconseille d'usage du préprocesseur, parce que l'écriture de fonctions inline permet de s'affranchir de ce genre de problèmes?

    Merci
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par mujigka
    Est-ce pour cette raison qu'on déconseille d'usage du préprocesseur, parce que l'écriture de fonctions inline permet de s'affranchir de ce genre de problèmes?
    L'argument principal contre les macros est :

    "Si une macro évalue un paramètre plus d'une fois, le résultat n'est pas prévisible dans le cas d'un appel avec un opérateur unaire".

    C'est vrai, mais qui ferait ça ?

    J'utilise dans mon code de bibliothèque :

    http://emmanuel-delahaye.developpez....b/ed/inc/sys.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define FREE(p)\
       free (p), (p) = NULL
    que j'utilise
    Evidemment si quelqu'un l'utilise
    ben il vaut mieux qu'il change de métier...

    Comme je le dit souvent "Le C n'est pas un langage de débutant".

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Merci Emmanuel! Sinon, tu vois d'autres restriction à l'utilsation de macros?

    Salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  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
    L'autre inconvénient par rapport aux macros, c'est le manque de vérification du type. Également, le fait que Visual en mode paranoiaque gueule "condition constante" sur le do{ quelque chose }while(0) (un truc souvent utilisé dans les macros quand un bloc{} est nécessaire).
    C'est pourquoi je serais plutôt du genre à n'utiliser des macros que pour ce que des fonctions inline ne peuvent pas faire: Par exemple une Item List, ou la conversion compile-time de l'opérande en chaîne, qui permet de faire ce genre de chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #define ITEM(x) case x: ret = #x; break;
     
    char const * getConstantName(int n)
    {
    char const * ret = "?";
    switch(n)
    	{
    	ITEM(UNE_CONSTANTE)
    	ITEM(UNE_AUTRE_CONSTANTE)
    	}
    return ret;
    }
    Edit: Corrigé le type de retour.
    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. [WD-2007] Utiliser des macros avec Word 2003
    Par paulinegue dans le forum Word
    Réponses: 3
    Dernier message: 26/10/2011, 10h54
  2. Utilisation des macros sous Powerpoint
    Par kikoo71 dans le forum Powerpoint
    Réponses: 5
    Dernier message: 19/10/2011, 19h39
  3. Utilisation des macros dans PowerPoint
    Par Claude_Azoulai dans le forum VBA PowerPoint
    Réponses: 6
    Dernier message: 22/07/2009, 11h33
  4. Utilisation des macros
    Par stefsas dans le forum Macro
    Réponses: 3
    Dernier message: 07/05/2008, 15h04
  5. Utiliser des macros Excel sous open office
    Par Memes dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 08/11/2007, 21h46

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