Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Définition d'un string dans un #define à la compilation

2 réponses
Avatar
Guillaume GOURDIN
Bonjour à tous,

dans mon Makile, j'ai un trucs dy style :
CFLAGS+= -DFOO=$(shell blablabla)

Après, je veux faire :
std::string text( FOO );

Mais évidemment, ça ne marche pas, car FOO n'est pas considéré comme une
chaine de caractère. la question est donc : comment faire en sorte que
FOO soit considéré comme tel?

J'ai essayé
CFLAGS+= -DFOO="$(shell blablabla)"

Mais ça ne marche pas.

Merci por votre aide.

2 réponses

Avatar
Jean-Marc Bourguet
Guillaume GOURDIN writes:

J'ai essayé
CFLAGS+= -DFOO="$(shell blablabla)"
Mais ça ne marche pas.


CFLAGS += -DFOO="$(shell echo Guillaume)"

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
James Kanze
On Sep 13, 11:32 am, Jean-Marc Bourguet wrote:
Guillaume GOURDIN writes:
J'ai essayé
CFLAGS+= -DFOO="$(shell blablabla)"
Mais ça ne marche pas.


CFLAGS += -DFOO="$(shell echo Guillaume)"


Je ne suis pas si sûr. Si le texte ne comporte pas d'éspaces,
d'accord. (Mais on pourrait aussi se servir de l'opérateur #
dans la source alors.) L'évaluation dépend aussi du shell
qu'invoque make, et peut varier; avec bash: -DTOTO=""abc def""
fait que g++ remplace TOTO avec "abc def". Mais le make que
j'utilise d'habitude (GNU make) n'invoque pas bash, mais le
shell de Bourne, où ça ne marche pas. Et ça ne m'étonnerais pas
que certains make sous Windows n'invoque pas de shell de tout.
(Sous Windows, GNU make utilise la variable d'environement
$SHELL, s'il est positionnée. Ce qui veut dire que dans les
environements où je travaille, je risque d'avoir bash ou ksh
sous Windows -- selon que j'utilise mSys ou UWin --, le shell de
Bourne sous Unix, et bash en mode compatible, ce qui ressemble
plutôt le shell de Bourne, sans être 100% identique non plus,
sous Linux.) Je n'ai pas accès à un système Windows avec tout

Un essai rapide sous Linux, Solaris et Windows/CygWin, montre
que -DTOTO='"abc def"' marche dans tous ces cas-ci. Mais c'est
loin d'être exhaustif -- pour commencer, c'est GNU make 3.81
dans tous les cas, et mon shell interactif est bash sous
Windows. (Mais s'il se sert de $(shell ...), je crois qu'on peut
supposer GNU make.)

J'ai aussi un cas des mes scripts où j'invoque un script de
shell pour invoquer le compilateur (mais seulement sous
Windows l'invocation du compilateur dépend évidemment de la
plateforme). Chaque invocation du shell, évidemment, enlève une
couche de , ' ou ". (Dans mon cas, le script supplémentaire
n'apparaît que sur certains plateformes, en plus.)

Enfin, s'il n'a pas de problème de l'invocation du compilateur à
travers un script (ce qui est quand même assez exceptionnel), la
solution la plus simple (et la plus portable) est probablement
d'utiliser :
CFLAGS += -DTOTO='$( shell ... )'
dans le fichier de make, et puis quelque chose comme:
#define SS( s ) # s
#define S( s ) SS( s )

S( TOTO )
dans ses sources.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34