C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

concatenation de chaines dans des macros

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Arnaud Meurgues
Guest





PostPosted: Tue Mar 07, 2006 1:06 pm    Post subject: concatenation de chaines dans des macros Reply with quote



Bonjour,

J'ai un problème avec gcc 3.4.4. En compilant :

---------------------------------------------------
#define CONCAT(a,b) a##b

static char name[] = CONCAT("un texte" ," en deux bouts");

int main() {}
---------------------------------------------------

Il me sort l'erreur suivante :
[meurgues@precision79]/tmp >g++ gcc.cpp
gcc.cpp:3:1: pasting ""un texte"" and "" en deux bouts"" does not give a
valid preprocessing token

Y a-t-il un moyen simple et élégant de contourner ce problème de gcc
(non, je ne peux pas changer la version) ?

Merci,
--
Arnaud
Back to top
Michel Decima
Guest





PostPosted: Tue Mar 07, 2006 1:06 pm    Post subject: Re: concatenation de chaines dans des macros Reply with quote



"Arnaud Meurgues" <news.arnaud (AT) meurgues (DOT) non.fr.invalid> a écrit dans le
message de news:440d7c78$0$28850$636a55ce (AT) news (DOT) free.fr...
Quote:
Bonjour,

J'ai un problème avec gcc 3.4.4. En compilant :

---------------------------------------------------
#define CONCAT(a,b) a##b

static char name[] = CONCAT("un texte" ," en deux bouts");

int main() {}
---------------------------------------------------

Il me sort l'erreur suivante :
[meurgues@precision79]/tmp >g++ gcc.cpp
gcc.cpp:3:1: pasting ""un texte"" and "" en deux bouts"" does not give a
valid preprocessing token

Y a-t-il un moyen simple et élégant de contourner ce problème de gcc

#define CONCAT(a, b) a b

ca marche dans le cas present, c'est simple, mais je ne sais pas si c'est
elegant (et il doit surement y avoir des contre indications cachees)

Quote:
(non, je ne peux pas changer la version) ?

avec gcc-4.0.2, j'ai le meme diagnostic pour la macro originale
(par contre xlC-6 l'accepte sans broncher)
Back to top
Arnaud Meurgues
Guest





PostPosted: Tue Mar 07, 2006 1:06 pm    Post subject: Re: concatenation de chaines dans des macros Reply with quote



Fabien LE LEZ wrote:

Quote:
Ce dont tu as besoin ici, c'est la macro suivante :

#define CONCAT(a,b) a b

Tiens, oui. Faut être crétin pour ne pas y avoir pensé.

Merci.

--
Arnaud (crétin)
Back to top
Arnaud Meurgues
Guest





PostPosted: Tue Mar 07, 2006 1:06 pm    Post subject: Re: concatenation de chaines dans des macros Reply with quote

Michel Decima wrote:

Quote:
#define CONCAT(a, b) a b

ca marche dans le cas present, c'est simple, mais je ne sais pas si c'est
elegant (et il doit surement y avoir des contre indications cachees)

Si, si. Ça semble parfaitement élégant.

Quote:
(par contre xlC-6 l'accepte sans broncher)

C'est ce qui m'a enduit d'erreur...

--
Arnaud
Back to top
Arnaud Meurgues
Guest





PostPosted: Tue Mar 07, 2006 1:06 pm    Post subject: Re: concatenation de chaines dans des macros Reply with quote

Arnaud Meurgues wrote:

Quote:
Si, si. Ça semble parfaitement élégant.

Contrairement à moi qui oublie de remercier.

Merci.

--
Arnaud (crétin et mal poli)
Back to top
Fabien LE LEZ
Guest





PostPosted: Tue Mar 07, 2006 1:06 pm    Post subject: Re: concatenation de chaines dans des macros Reply with quote

On Tue, 07 Mar 2006 13:29:15 +0100, Arnaud Meurgues
<news.arnaud (AT) meurgues (DOT) non.fr.invalid>:

Quote:
#define CONCAT(a,b) a##b

static char name[] = CONCAT("un texte" ," en deux bouts");

Le symbole "##" sert à la concaténation d'indentifiants.

Ce dont tu as besoin ici, c'est la macro suivante :

#define CONCAT(a,b) a b
Back to top
kanze
Guest





PostPosted: Tue Mar 07, 2006 4:06 pm    Post subject: Re: concatenation de chaines dans des macros Reply with quote

Fabien LE LEZ wrote:
Quote:
On Tue, 07 Mar 2006 13:29:15 +0100, Arnaud Meurgues
news.arnaud (AT) meurgues (DOT) non.fr.invalid>:

#define CONCAT(a,b) a##b

static char name[] = CONCAT("un texte" ," en deux bouts");

Le symbole "##" sert à la concaténation d'indentifiants.

Dans la pratique, c'est rare que le résultat ne doit pas servir
d'identifant. Mais rien ne l'oblige, et les paramètres ne sont
pas toujours des identifiants, par exemple :

#define PASTE2( a, b ) a ## b
#define PASTE( a, b ) PASTE2( a, b )
#define UNIQUENAME( prefix ) PASTE( prefix, __LINE__ )

(On remarque que l'expansion de __LINE__ n'est pas un
identifiant.)

--
James Kanze GABI Software
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
Back to top
Arnaud Meurgues
Guest





PostPosted: Tue Mar 07, 2006 6:06 pm    Post subject: Re: concatenation de chaines dans des macros Reply with quote

kanze wrote:

Quote:
#define CONCAT(a,b) a##b

Dans la pratique, c'est rare que le résultat ne doit pas servir
d'identifant. Mais rien ne l'oblige, et les paramètres ne sont
pas toujours des identifiants, par exemple :

#define PASTE2( a, b ) a ## b
#define PASTE( a, b ) PASTE2( a, b )

À quoi sert de passer par une macro intermédiaire ?
En fait, le code que j'avais et qui ne compilait pas avec gcc (mais avec
tous les autres compilos de mes portages) utilise aussi cette forme à
deux macros.

--
Arnaud
Back to top
James Kanze
Guest





PostPosted: Tue Mar 07, 2006 7:06 pm    Post subject: Re: concatenation de chaines dans des macros Reply with quote

Arnaud Meurgues wrote:
Quote:
kanze wrote:

#define CONCAT(a,b) a##b

Dans la pratique, c'est rare que le résultat ne doit pas
servir d'identifant. Mais rien ne l'oblige, et les paramètres
ne sont pas toujours des identifiants, par exemple :

#define PASTE2( a, b ) a ## b
#define PASTE( a, b ) PASTE2( a, b )

À quoi sert de passer par une macro intermédiaire ?

À le faire marcher:-).

En fait, quand un paramètre sert d'opérand à ## ou à #, on
l'utilise littéralement, sans expansion. Sans la macro
intermédiaire, alors,

#define PASTE2( a, b ) a ## b
#define PASTE( a, b ) PASTE2( a, b )
#define UNIQUENAME( prefix ) PASTE( prefix, __LINE__ )

int UNIQUENAME( aa ) ;
int UNIQUENAME( aa ) ;

devient :

int aa__LINE__ ;
int aa__LINE__ ;

Ce qui n'est pas le but.

Telle que je l'ai écrit, en revanche, __LINE__ est paramètre de
PASTE ; l'expansion a donc lieu dans l'appel à PASTE, parce que
dans PASTE, il n'est pas paramètre d'un ##, et on a le résultat
voulu :

int aa6 ;
int aa7 ;

(Dans le temps, on utilisait de telles techniques pour des
variables locales des fonctions « pseudo-inline », faites à base
des macros.)

Quote:
En fait, le code que j'avais et qui ne compilait pas avec gcc
(mais avec tous les autres compilos de mes portages) utilise
aussi cette forme à deux macros.

C'est un idiome devenu classique.

--
James Kanze kanze.james (AT) neuf (DOT) fr
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
Back to top
Arnaud Meurgues
Guest





PostPosted: Wed Mar 08, 2006 10:06 am    Post subject: Re: concatenation de chaines dans des macros Reply with quote

James Kanze wrote:

Quote:
En fait, quand un paramètre sert d'opérand à ## ou à #, on
l'utilise littéralement, sans expansion.

Ok. Bizarrement, cet idiome était utilisé alors qu'il ne servait qu'à
concaténer des chaînes de caractères.

Et sinon, entre gcc qui génère une erreur et Comeau qui accepte sans
broncher, lequel a raison ?

--
Arnaud
Back to top
Arnaud Meurgues
Guest





PostPosted: Wed Mar 08, 2006 7:06 pm    Post subject: Re: concatenation de chaines dans des macros Reply with quote

Jean-Marc Bourguet wrote:

Quote:
Le comportement est explicitement indefini. (Voir 16.3.3/3)

Ah oui. Effectivement. Merci bien.

--
Arnaud
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Wed Mar 08, 2006 7:06 pm    Post subject: Re: concatenation de chaines dans des macros Reply with quote

Arnaud Meurgues <news.arnaud (AT) meurgues (DOT) non.fr.invalid> writes:

Quote:
James Kanze wrote:

En fait, quand un paramètre sert d'opérand à ## ou à #, on
l'utilise littéralement, sans expansion.

Ok. Bizarrement, cet idiome était utilisé alors qu'il ne servait qu'à
concaténer des chaînes de caractères.

Et sinon, entre gcc qui génère une erreur et Comeau qui accepte sans
broncher, lequel a raison ?

Le comportement est explicitement indefini. (Voir 16.3.3/3)

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
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.