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 :

préprocesseur et lisibilité du code


Sujet :

C

  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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut préprocesseur et lisibilité du code
    Bonjour à tous,

    Débutant pratiquant le C assidument depuis un peu plus de deux ans, il m'arrive de me ponger dans le code d'applications libres dans un but d'auto-formation. Il y a une chose qui me pose énormément de problèmes (j'en ai même mal à la tête), c'est l'utilisation massive de la compilation conditionnelle.

    Comment faites-vous, lorsque vous avez à maintenir un code en C qui vous n'avez pas écrit vous-même (je pense que cela arrive souvent), lorsque vous êtes face à une suite de #ifdef ... #endif, etc. Y a-t'il un moyen de connaître (via une commande de GCC) les constantes du préprocesseur qui sont définies à une certain moment du programme? Un des objetctif clé de la compilation conditionnelle semble être la portabilité multi-plateforme. Y a-t'il un moyen simple de connaîtres les constantes du pré-processeur qui sont définies par défaut sur ma plateforme? (J'ai un PC avec processeur PIII qui tourne sous Linux Debian SID avec GCC 4.0.2)

    En ce qui concerne la pratique courante pour écrire du code lisible... Conseilleriez-vous de limiter l'usage de la compilation conditionnelle? Tout cela, c'est des préoccupations de débutant, mais votre avis m'interesse beaucoup, et vos conseils seront appréciés à leur juste valeur! Meilleures 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++

    +

  2. #2
    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
    Ton constat concerne essentiellement les fichiers entetes de gcc, qui sont en effet remplis de directives de pre-process. La meilleure solution est de ne pas les regarder ! Je ne connais pas de moyen simple de connaitre les macros definies a la compilation. Elles dependent notamment des options envoyees a gcc (comme -ansi, par exemple). Je pense qu'une option de gcc (enfin, de cpp), permet d'afficher le code source tel qu'il est produit par le pre-processeur.

    Concernant la programmation portable, le plus simple est d'utiliser des bibliotheques tierces qui 'cachent' les aspects machines-dependants et evitent les multiples ifdefs. Sinon, programmer en C standard permet (a de rares exceptions) d'eviter completement les directives machines-dependantes. Mais le C standard ne permet que des choses de bases (pas de mode fenetre ou graphique, par exemple).

  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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Merci beaucoup!

    Il n'y s'agit bien de directives définie en grande partie dans les fichiers entête standard. L'utilisation massive de la compilation conditionnelle rend le code vraiment très difficile à lire. Avez-vous déjà eu à maintenir de tels programmes?

    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++

    +

  4. #4
    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 mujigka
    Il n'y s'agit bien de directives définie en grande partie
    tu peux rephraser stp ?
    dans les fichiers entête standard. L'utilisation massive de la compilation conditionnelle rend le code vraiment très difficile à lire. Avez-vous déjà eu à maintenir de tels programmes?
    C'est vrai que c'est assez cauchemardesque. Mon petit 'truc' pour m'ensortir, ajouter une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #error "message intelligent a catactere informatif..."
    là où ca devrait compler, pour vérifier. Si ça bug, c'est que c'est bon...
    Pas de Wi-Fi à la maison : CPL

  5. #5
    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 mujigka
    Avez-vous déjà eu à maintenir de tels programmes?
    Pour mes programmes à usage personnel (i.e. non opérationnels et non supportés), j'utilise très rarement de compilation conditionnelle. Parfois, un appel à system() est encadré par un #ifdef linux car la version de l'utilitaire appelé n'accepte par les mêmes options que sous Unix.

    Par contre, pour les systèmes opérationnels, on utilise en beaucoup, notamment pour contrôler les versions des routines qui sont compilées. Chaque fichier source est encadré par un define qui donne la version, et il suffit de faire une liste de defines au début de la compilation pour sélectionner telle ou telle version d'une routine donnée. Evidemment, c'est assez affreux à manager et il faut quelqu'un dont le job est de contrôler les versions, éviter les incompatibilités etc. Heureusement, ce n'est pas mon travail!

  6. #6
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    La compilation conditionnelle peut servir aussi quand tu as plusieurs compilateurs et que tu utilise du code reconnu par un compilateur particuliers.
    Ou même si tu utilise l'unicode, tu vas avoir certaines fonction à modifier, si tu compile en unicode ou non...
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  7. #7
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    mujigka a écrit:
    Il n'y s'agit bien de directives définie en grande partie
    tu peux rephraser stp ?
    Je rephrase donc: ce qui me pose le plus de problèmes sont les constantes définies par défaut ou dans les fichiers d'entête standards. Ces définitions varies selon la plateforme, le compilo, et cela me pose des problèmes fous lorsque je veux suivre ce que fait un bout de code remplis d'instructions préprocesseur du type #if defined ... #else.... #endif.
    "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++

    +

  8. #8
    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 mujigka
    mujigka a écrit:
    Il n'y s'agit bien de directives définie en grande partie
    tu peux rephraser stp ?
    Je rephrase donc: ce qui me pose le plus de problèmes sont les constantes définies par défaut ou dans les fichiers d'entête standards. Ces définitions varies selon la plateforme, le compilo, et cela me pose des problèmes fous lorsque je veux suivre ce que fait un bout de code remplis d'instructions préprocesseur du type #if defined ... #else.... #endif.
    Ok. C'est vrai que ce n'est pas facile. 2 pistes t'ont été indiquées.
    • L'expansion du préprocesseur
    • la directive #error
    Pas de Wi-Fi à la maison : CPL

  9. #9
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Merci pour vos réponses. Sur la liste news:fr.comp.lang.c, on m'a indiqué d'utiliser avec GCC la ligne de commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -E -dM monProg.c
    Cela permet d'afficher toutes les constantes du préprocesseur définies dans dans le fichier passé à GCC (ici monProg.c).

    Je vais essayer de me documenter pour voir s'il existe une equivalente avec d'autres compilateurs (e.g. Borland, Intel, MS). Si vous avez des tuyaux...

    En ce qui concerne GCC, je devrais maintenant pouvaoir m'en sortir avec:
    - l' option -E pour l'expension du préprocesseur et le couple -E -dM
    - quelques directive #error

    Merci encore pour vos conseils avertis qui m'ont été d'une aide précieuse. Meilleures 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++

    +

  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 mujigka
    Merci pour vos réponses. Sur la liste news:fr.comp.lang.c,
    Argh ! C'est pas une 'liste', mais un forum Usenet...

    un petit click sur [Résolu]...
    Pas de Wi-Fi à la maison : CPL

  11. #11
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    autant pour moi!

    Meilleures 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++

    +

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par mujigka
    Je vais essayer de me documenter pour voir s'il existe une equivalente avec d'autres compilateurs (e.g. Borland, Intel, MS).
    -E est standard sous Unix (c'est meme demande par posix si j'ai bonne memoire)
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  13. #13
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Merci pour votre aide,

    J'ai classé le post comme résolu! Je vais essayé d'aller de l'avant avec tout ça. Ma conclusion de tout est que je vais essayer de limiter au maximum l'utilisation de la compilation conditionnelle dans mon propre code.

    Merci pour tout et meilleures salutations
    "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++

    +

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

Discussions similaires

  1. Lisibilité du code : comment gérer une ligne trop longue?
    Par ben53 dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 17/03/2009, 14h22
  2. Améliorer la lisibilité du code ..
    Par Alpha4 dans le forum Delphi
    Réponses: 8
    Dernier message: 17/05/2007, 00h08
  3. [POO] Avis sur la Lisibilité du code
    Par redsaint0 dans le forum Langage
    Réponses: 7
    Dernier message: 12/03/2007, 21h09

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