public inbox for gcc-prs@sourceware.org help / color / mirror / Atom feed
From: "Baum, Nathan I" <s0009525@chelt.ac.uk> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, Subject: RE: preprocessor/4923: Concatenation appears to handle whitespace incorrectly Date: Mon, 19 Nov 2001 20:32:00 -0000 [thread overview] Message-ID: <20011123193601.29673.qmail@sourceware.cygnus.com> (raw) The following reply was made to PR preprocessor/4923; it has been noted by GNATS. From: "Baum, Nathan I" <s0009525@chelt.ac.uk> To: 'Zack Weinberg' <zack@codesourcery.com> Cc: "'gcc-gnats@gcc.gnu.org'" <gcc-gnats@gcc.gnu.org> Subject: RE: preprocessor/4923: Concatenation appears to handle whitespace incorrectly Date: Fri, 23 Nov 2001 19:32:29 -0000 >From: 'Zack Weinberg' [mailto:zack@codesourcery.com] >Sent: 23 November 2001 18:51 >To: Baum, Nathan I >> Would it break existing programs if ## were to concatenate the two tokens >> regardless (in some later version of gcc)? I'd imagine that no sensible >> program would rely upon undefined behaviour, so it shouldn't. Presumeably, >> it'd have to throw the two tokens away and rescan the newly created string, >> but that doesn't _seem_ like a major problem (I don't know how CPP handles >> these things internally, so it might be). > >It does, in fact, concatenate "the two tokens" in the textual output - >but the two tokens which get concatenated are ")" and "def". >Contrast > >#define a(x) FOO(abc) ## x >#define b(x) FOO(abc) x > >a(def) -> FOO(abc)def >b(def) -> FOO(abc) def Ah-ha. I grok that now. The problem isn't anything to do with ##, it's that the macro substitution puts in the whitespace, _after_ ## has done its stuff. >To do what you apparently want, when the ")" was the last character of >a macro invocation, it would have to remember that it had been pasted >after and apply the paste to the last token of the macro expansion. It looks like you could elect not to add any whitespace if the last character was a ")" (or some other single-character token ("(*/?:%^!")). Presumeably, that would never break a program. But, I've just checked the C++ specification for the preprocessor, and it appears that would be against the rules. >This would be a lot of work and frankly I don't see the point. Show >me real code that desperately needs this functionality and I'll show >you how to fix it so it's standard conforming C. As far as I tell, I have no use for this feature, myself. Somebody wanted to know how they could do something like: #define CONCAT(a,b) a ## b #define STRCAT(a,b) #CONCAT(a,b) #include STRCAT(PREFIX, foobar.h) Naturally, this didn't work because of the macros' order of evaluation. On the other hand: #define STRCAT(a,b) #a #b #include STRCAT(PREFIX, foobar.h) I just tested that on gcc, to prove to myself that it wouldn't work, and it did. I assume, therefore, that he was using a non-gcc compiler (probably VC++, thinking about it), which wasn't happy about the multiple strings. The Standard says that the behaviour in this instance is undefined (oddly, it goes so far as to point out that by this time, strings wouldn't have been concatenated, but doesn't bother to specify that they should be in this situation.)
next reply other threads:[~2001-11-23 19:36 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2001-11-19 20:32 Baum, Nathan I [this message] -- strict thread matches above, loose matches on Subject: below -- 2001-11-19 20:36 'Zack Weinberg' 2001-11-19 20:27 'Zack Weinberg' 2001-11-18 16:50 Baum, Nathan I 2001-11-17 0:46 rodrigc 2001-11-17 0:44 rodrigc 2001-11-16 23:56 Zack Weinberg 2001-11-16 23:46 s0009525
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20011123193601.29673.qmail@sourceware.cygnus.com \ --to=s0009525@chelt.ac.uk \ --cc=gcc-prs@gcc.gnu.org \ --cc=nobody@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).