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 :

"Variable" dans compilateur


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut "Variable" dans compilateur
    Bonjour,

    Je code en C un µC PIC, et quand je créé un nouveau projet, l'IDE (MPLabX)
    Je vient de remarquer quelque chose que je ne connait pas, dans le code qui suit, le compilateur "test" des "variable" pour inclure un header particulier.

    Ou sont défini ces "variables" que teste le compilateur ? Peut t'on définir le même genre de variables pour procéder de même dans notre code ?

    Merci !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #if defined(__XC)
        #include <xc.h>        /* XC8 General Include File */
    #elif defined(HI_TECH_C)
        #include <htc.h>       /* HiTech General Include File */
    #elif defined(__18CXX)
        #include <p18cxxx.h>   /* C18 General Include File */
    #endif
     
    #if defined(__XC) || defined(HI_TECH_C)
     
    #include <stdint.h>        /* For uint8_t definition */
    #include <stdbool.h>       /* For true/false definition */
     
    #endif

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Ce ne sont pas des "variables" à proprement parler... précisément, ce sont des variables pour le précompilateur (cpp sur gcc, et autre chose chez les autres).

    Ces variables servent à connaitre l'environnement du compilateur, et les paramètres donnés au compilo.
    Tout ce qui commence par # est une commande pour le précompilo.

    Ces variables tu dois pouvoir les trouver dans ton IDE (à chercher dans tous les menus liés à ton projet).

    Tu dois pouvoir en définir si ton IDE te permet de modifier la ligne de commande utilisée pour compiler les fichiers.

    Modifier ces variables et le code entre les #ifdef #else #endif modifiera le code généré AVANT qu'il soit compilé !

    Par exemple, en fichier d'entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #define MA_VAR
     
    #ifdef MA_VAR
      printf("Ceci sera imprimé");
    #endif
    #ifdef AUTRE_VAR
      printf("mais pas cela")
    #endif
    Cela génèrera le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      printf("Ceci sera imprimé");
    Qui sera compilé après.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Salut
    Comme le dit Metalman, ce ne sont pas des variables mais des macrodéfinitions.

    Ces macros peuvent être inscrites directement dans le code (comme l'exemple de Metalman) mais aussi envoyées au code par le compilateur en utilisant la directive -D

    Si on reprend l'exemple de Metalman mais qu'on compile en rajoutant l'option "-D AUTRE_VAR" alors cela génèrera le code
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("Ceci sera imprimé");
    printf("mais pas cela");
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Les fichiers pour PIC en contiennent beaucoup, pour choisir le compilateur utilisé et paramétrer la chaine de compilation, comme dans ton exemple. Il y en a aussi beaucoup pour inclure les définitions de modules et autres pins en fonctions de la référence exact du µC utilisé.

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Salut,

    Je vais essayer de trouver ça dans l'IDE mais ça n'a pas l'air gagner ^^
    De la même façon, on peut renvoyer des erreurs à la compilation en fonction de certaine variable du code ?

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Tu devrais te renseigner sur ce qu'est un pré-processeur et les directives qu'il est capable de gérer. Ça te sera utile

    Pour générer une erreur, il suffit de faire #error suivi d'un message. Tu peux aussi faire #warning.

    Tu n'as pas forcément besoin de tout retrouver dans l'environnement. Dans MPLAB, beaucoup sont positionnés de manière cachée quand tu choisis dans le wizard la puce que tu utilises, quand tu paramètres ta toolchain dans les options, etc.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par petitnul12 Voir le message
    De la même façon, on peut renvoyer des erreurs à la compilation en fonction de certaine variable du code ?
    Non. La compilation ne regarde pas la valeur des variables. Celles-ci sont évaluées lors de l'exécution.

    Toutefois il existe la macro assert() qui fait l'évaluation demandée et qui renvoie une erreur si cette évaluation est fausse
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <assert.h>
    for (i=0; i < 5; i++)
    {
        printf("i=%d\n", i);
        assert (i >= 0);
    }
    Si pour une raison ou une autre i devient négative, le programme s'arrête et renvoie une erreur disant que l'assertion n'est pas vérifiée.
    C'est pratique lors des mises au point pour s'assurer de la validité des paramètres reçus ou autres soucis éventuels.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Merci =)

    Je vais me documenter sur le pré-processeur, on nous en dit bien peu en cours, et ça a l'air bien plus puissant que ça en a l'air !

  9. #9
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Cela peut être très puissant en effet, et mène directement aux "templates" du C++ (à voir beaucoup plus tard).

    Le fait que les écoles ne l'apprennent pas tellement est souvent reproché, mais comme il faut d'abord bien comprendre "le code" avant de s'aventurer sur "générer du code avec du méta-code/pré-processeur", c'est un minimum justifié.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  10. #10
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    On manque cruellement de temps !
    On à vu les templates du C++ aussi =)

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