4 votes

Placer le macro de définition entre deux littéraux de chaîne

Je sais qu'il est possible de concaténer un macro défini avec une chaîne de caractères comme ceci

#define R "car"
const char * s1 = "foo"R; //s1="foocar"

Mais quand j'essaie de placer R entre deux littéraux de chaîne de caractères comme ceci

#define R "car"
const char * s1 = "foo"R"bar"; //erreur de compilation

Je reçois une erreur de compilation erreur : 'R' égaré dans le programme. Comment peut-on arriver à l'objectif du deuxième exemple ci-dessus afin que s1 = "foocarbar"?

4voto

Keith Thompson Points 85120

C++ a une fonctionnalité appelée "littéraux de chaînes bruts", introduite par la lettre R.

gcc semble supporter les littéraux de chaînes brutes de style C++ en C en tant qu'extension. Si vous aviez utilisé un nom autre que R pour votre macro, vous n'auriez pas eu ce problème.

La concaténation des littéraux de chaînes ne nécessite pas que les littéraux de chaînes soient adjacents. Plutôt que ceci :

#define R "car"
const char * s1 = "foo"R"bar"; 

vous pouvez écrire :

#define R "car"
const char * s1 = "foo" R "bar";

Mais votre code original est du C valide, et gcc devrait l'accepter si vous utilisez une option telle que -std=c11 pour rendre gcc plus conforme.

Notez que vous n'auriez pas eu de problème si vous aviez utilisé un nom autre que R pour votre macro.

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