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.)


             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: link
Be 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).