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 :

Définir une macro string par l'option -D du compilateur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut Définir une macro string par l'option -D du compilateur
    Bonjour,
    mon problème est simple, mais pas très facile à expliquer :

    Je voudrais obtenir l'équivalant de
    #define NAME "toto"
    à partir de la ligne de commande du compilateur/preprocesseur.

    Ce que j'avais avant dans foo.c :
    #define NAME "toto"
    et plus loin :
    const char * name = NAME ;
    et ça marche impec !
    J'ai bien name qui contient "toto".

    Ce que je voudrais maintenant, c'est que la chaîne "toto" vienne de ma ligne de commande.
    Donc, naïvement, j'ai foo.c qui contient :
    const char * name = NAME ;
    et sur ma ligne de commande :
    gcc foo.c -DNAME="toto"
    (j'utilise gcc juste pour cet exemple)

    Le problème c'est que les guillemets sautent au passage :
    Un fois préprocessé (option -E), mon code contient :
    const char * name = toto ;
    et bien sûr, ça ne compile pas car toto est un symbole inconnu.
    En fait, c'est exactement comme si ma ligne de commande était :
    gcc foo.c -DNAME=toto
    (sans les guillemets)

    J'ai bien essayé de faire joujou avec les opérateurs # et ## mais rien ne marche !
    je pensais m'y connaître en preprocess mais là, je suis comme un bleu...

    Si quelqu'un a une idée, je suis preneur !
    Merci d'avance.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    As-tu essayé d'échapper les guillemets :
    gcc foo.c -DNAME="\"toto\""

  3. #3
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Bonsoir,

    Je confirme que la méthode de Neckara (légèrement retouchée), c'est-à-dire gcc test.c -DNAME=\"toto\" -E, fonctionne chez moi. En simple complément de réponse (qui ne te servira pas, si ce n'est pour l'entraînement au maniement du préprocesseur), tu aurais pu te servir des opérateurs spécifiques du préprocesseur comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #define GET_XNAME(x) #x
    #define GET_NAME(x)  GET_XNAME(x)
     
    int main(void)
    {
        char const *s = GET_NAME(NAME);
        return 0;
    }
    Bonne soirée.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  4. #4
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut


    trop forts les gars !
    Voilà ce que je n'avais pas compris : c'est le shell qui enlève les guillemets !

    Pour info, j'ai creusé un peu et voici un petit complément :
    On a des petits soucis quand la chaîne contient des espaces multiples :

    Voici foo.c (qui ne compile pas, mais on s'en fiche)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define GET_XNAME(x) #x
    #define GET_NAME(x)  GET_XNAME(x)
    GET_NAME(NAME)
    NAME
    Et voici quelques variantes de ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #gcc foo.c -E -DNAME="aze     qsd"
    "aze qsd"
    aze qsd
     
    #gcc foo.c -E -DNAME=\"aze     qsd\"
    ""aze"
    "aze
     
    #gcc foo.c -E -DNAME="\"aze     qsd\""
    "\"aze     qsd\""
    "aze     qsd"
    Finalement, le truc qui marche à tous les coups, c'est bien la chaîne guillemets + guillemets échappés.

    Mais l'astuce avec la double macro GET_NAME+GET_XNAME qui "requote" un define dans le code, là, je dis, chapeau bas !

    Encore merci !

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    autrement, tu peux aussi utiliser -DNAME='"truc" "muche"'

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

Discussions similaires

  1. Comment définir une variable connu par tous les évènements
    Par whitespirit dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 17/06/2008, 14h55
  2. Suppression d'une macro VB par une macro : Problème " Mode Arrêt "
    Par CGANE dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/05/2008, 15h50
  3. Réponses: 7
    Dernier message: 03/10/2007, 17h58
  4. Définir une form principale par programme
    Par dz_bill dans le forum Delphi
    Réponses: 18
    Dernier message: 17/06/2007, 21h13
  5. Lancer une macro vba par menu
    Par jedwiller dans le forum Access
    Réponses: 3
    Dernier message: 09/05/2006, 16h19

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