107 votes

Comment définir une chaîne littérale dans la ligne de commande de gcc ?

Dans la ligne de commande de gcc, je veux définir une chaîne de caractères telle que -Dname=Mary puis dans le code source je veux printf("%s", name); pour imprimer Mary .
Comment pourrais-je le faire ?

11 votes

Je vous recommande vivement d'utiliser les majuscules ( -DNAME=\"Mary\" )pour les jetons que vous allez définir de cette manière, afin qu'ils ressemblent à d'autres macros.

0 votes

La macro dans la question de la chaîne : stackoverflow.com/questions/240353/

120voto

Arthur Shipkowski Points 1888

Deux options. D'abord, échapper aux guillemets pour que la coquille ne les mange pas :

gcc -Dname=\"Mary\"

Ou, si vous voulez vraiment -Dname=Mary, vous pouvez le mettre en chaîne, mais c'est un peu compliqué.

#include <stdio.h>

#define STRINGIZE(x) #x
#define STRINGIZE_VALUE_OF(x) STRINGIZE(x)

int main(int argc, char *argv[])
{
    printf("%s", STRINGIZE_VALUE_OF(name));
}

Notez que STRINGIZE_VALUE_OF s'évalue heureusement jusqu'à la définition finale d'une macro.

0 votes

Merci beaucoup Arthur. Vous devez être un expert en C. Autre question : Je préfère la deuxième option. Quand j'utilise STRINGIZE_VALUE_OF(name), il le traduit par "1", dans le cas où j'ai gcc -Dname=Mary -DMary. Y a-t-il un moyen de laisser gcc arrêter l'interprétation de Mary ?

0 votes

Richard, après mûre réflexion, je ne pense pas pouvoir trouver une solution qui fonctionne dans l'exemple ci-dessus. Malheureusement, vous avez le choix entre l'absence d'expansion (par exemple, cela vous donne "nom") et l'expansion complète (par exemple, nom->Mary->1 si Mary est définie comme 1). En fonction de votre cas d'utilisation exact, il peut y avoir des moyens de contourner cela - si Mary peut devenir un const int plutôt qu'un define, par exemple.

0 votes

Quelqu'un peut-il expliquer pourquoi il est nécessaire d'utiliser des macros de stringification imbriquées de cette manière ? Il semble que le résultat devrait être le même, mais l'appel à STRINGIZE_VALUE_OF() semble forcer l'expansion de la macro de l'argument, alors que STRINGIZE() ne le fait pas.

34voto

Johann Points 410

Pour éviter que l'interpréteur de commandes ne "mange" les guillemets et les autres caractères, vous pouvez essayer les guillemets simples, comme ceci :

gcc -o test test.cpp -DNAME='"Mary"'

De cette façon, vous avez un contrôle total sur ce qui est défini (guillemets, espaces, caractères spéciaux, etc.).

10voto

psihodelia Points 6658

Le moyen le plus portable que j'ai trouvé jusqu'à présent est d'utiliser \"Mary\" - il fonctionnera non seulement avec gcc mais avec tout autre compilateur C. Par exemple, si vous essayez d'utiliser /Dname='"Mary"' avec le compilateur Microsoft, il s'arrêtera avec une erreur, mais /Dname=\"Mary\" fonctionnera.

8voto

Samuel Points 303

Dans Ubuntu, j'utilisais un alias qui définissait CFLAGS, et CFLAGS incluait une macro qui définissait une chaîne de caractères, puis j'utilisais CFLAGS dans un Makefile. J'ai dû échapper les caractères guillemets doubles ainsi que les caractères \. Cela ressemblait à quelque chose comme ceci :

CFLAGS='" -DMYPATH=\\\"/home/root\\\" "'

2 votes

Parfois, l'échappement simple et la mise entre guillemets simples ne fonctionnaient pas, mais cette méthode a fonctionné. D'autres fois, ce n'est pas le cas. Je pense que la différence est de savoir si les drapeaux sont mis entre guillemets dans l'ensemble : 1) DEFINES=-DLOGPATH=\"./logfile\" CFLAGS = -v $(DEFINES).... 2) DEFINES=-DLOGPATH=\\\"./logfile\\\" CFLAGS = "-v $(DEFINES)...." L'utilisation de l'option -v compiler est utile pour voir ce que fait le préprocesseur.

2voto

bttcld Points 21

C'est ma solution pour : **-DUSB_PRODUCT=\""Arduino Leonardo\""**
Je l'ai utilisé dans un makefile avec :
GNU Make 3.81 (de GnuWin32)
y
avr-g++ (AVR_8_bit_GNU_Toolchain_3.5.0_1662) 4.9.2

Le résultat dans un fichier précompilé (option -E pour g++) est :
const u8 STRING_PRODUCT[] __attribute__((__progmem__)) = "Arduino Leonardo";

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X