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 :

Option de compilation [FAQ]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 41
    Par défaut Option de compilation
    Bonjour,

    Dans mon makefile, je compile un fichier .c avec l'option -DVERSION=VERSION_XXX, (pas de double-quotes)

    Dans le fichier source, je voudrais pouvoir récupérer cette valeur dans un char*.

    Donc je fais une macro:
    #define VERSION_TITLE(x) {std::cout<<#x<<std::endl;}
    VERSION_TITLE(VERSION);

    Or, l'execution m'affiche "VERSION" et non pas "VERSION_XXX".

    Comment peux-t-on forcer l'évaluation par le préprocesseur de VERSION dans l'expression #VERSION ?
    J'ai essayé (avec c'est bien vrai peu d'espoir) ###version en espérant que la priorité donnerait #(##(VERSION)) mais ca ne marche pas.

    D'autre part je pourrais me dérouiller en mettant les quotes dans le makefile:
    -DVERSION="VERSION_XXX", (pas de double-quotes), mais j'obtiens alors "VERSION_XXX undeclared" à la compil, ce qui signifierait (est-ce bien normal???) que les dbl-quotes n'ont pas été prises en compte bien (alors que je les vois bien dans la ligne de commande du make)...

    Merci pour vos idées...

  2. #2
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Déjà, cout et endl c'est à côté pas ici...

    Ensuite cela dépend ce que tu veux, est-ce que ton XXX est un nombre ou pas ? Cela changera la réponse.

    Dans le cas d'un nombre c'est possible mais sinon cela me semble difficile de le faire en passant par là...

    Jc

  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
    Je ne sais pas si c'est ce que tu veux, mais je ferais comme cela:
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    #define xstr(s) str(s)
    #define str(s) #s
     
    #define VERSION VERSION_2_5
     
    int main(void)
    {
        char const *version = xstr(VERSION);
        puts(version);
     
        return EXIT_SUCCESS;
    }
    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
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par mujigka
    Je ne sais pas si c'est ce que tu veux, mais je ferais comme cela:
    Oui le problème vient de là :
    Citation Envoyé par [url=http://www.developpez.net/forums/showpost.php?p=768827&postcount=9]Emmanuel Delahaye[/url]
    #xxx est une instruction de préprocesseur 'terminale'.

    Il faut lire la grammaire du préprocesseur. Je te le laisse...

    http://www.open-std.org/jtc1/sc22/wg...docs/n1124.pdf
    Comment convertir un nombre en chaîne de caractères lors de la précompilation ?

  5. #5
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Quelque chose me chagrine dans cet FAQ, en particulier dans la dernière phrase.
    Je cite :
    N.B. : il est nécessaire d'utiliser une double macro car les arguments des macros sont substitués dans un second temps, l'appel à str(10) serait donc remplacé par "s".
    Si je suis l'exemple donné par gl, on obtiens les mêmes résultats dans les 2 cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <stdlib.h>
     
    #define xstr(s) str(s)
    #define str(s) #s
     
    int main(void)
    {
        printf("%s\n", xstr(10));
        printf("%s\n", str(10));
        return EXIT_SUCCESS;
    }
    Pour bien faire, il aurais fallu définir une constante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    #include <stdlib.h>
     
    #define xstr(s) str(s)
    #define str(s) #s
    #define CONSTANTE 10
     
    int main(void)
    {
        printf("%s\n", xstr(CONSTANTE));
        printf("%s\n", str(CONSTANTE));
        return EXIT_SUCCESS;
    }
    C'est vrai que je chipotte, mais bon....

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 41
    Par défaut [resolu]
    Ok merci pour les réponses, ça marche effectivement mieux avec "double macro". Je croyais pourtant l'avoir essayée (mais j'avais peut etre mis dans l'autre ordre, ce qui marche sans doute moins bien)!

    PS: Je sais bien que je suis dans le forum C, mais honnetement, ce n'est pas franchement une question C++!

  7. #7
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par crocodilex
    Quelque chose me chagrine dans cet FAQ, en particulier dans la dernière phrase.
    Remonté en haut lieu, c'est vrais que si on dit que ça ne fonctionne pas et que l'on donne un exemple qui fonctionne ça n'aide pas


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

Discussions similaires

  1. [compilateur cc] Options de compilation
    Par gangsoleil dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 26/09/2005, 15h25
  2. Option de compilation gcc : sem.h
    Par Luther13 dans le forum Linux
    Réponses: 8
    Dernier message: 29/12/2004, 12h29
  3. [Compilateur]Option de compil
    Par Guybrush dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 30/09/2004, 11h22
  4. Réponses: 2
    Dernier message: 15/05/2004, 18h33
  5. Réponses: 2
    Dernier message: 27/02/2004, 13h47

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