Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Jul 1996 22:37:58 -0700 (MST)
From:      Don Yuniskis <dgy@rtd.com>
To:        bde@zeta.org.au (Bruce Evans)
Cc:        dgy@rtd.com, freebsd-hackers@freefall.freebsd.org, freebsd-ports@freefall.freebsd.org
Subject:   Re: Q: macro expansion
Message-ID:  <199607110537.WAA17247@seagull.rtd.com>
In-Reply-To: <199607102304.JAA31461@godzilla.zeta.org.au> from "Bruce Evans" at Jul 11, 96 09:04:05 am

next in thread | previous in thread | raw e-mail | index | archive | help
> >	#define X 1
> >	#define Y 2
> >	X+Y
> >I was surprised to see that ``X+Y'' was expanded to ``1 +2''.  So,
> >I started digging through ANSI and couldn't seem to locate something
> >to clearly define this behaviour.
> >	- why the inserted whitespace?
> 
> See the ISO C standard section 6.8.3 (Macro Replacement).  Macros are
> expanded as if they were tokenized before expansion (so a `+' at the

Ah!  Hadn't realized that!  ^^^^^^^^^^^^^^^^^^^^^^

> end of X doesn't get joined with the `+' in X+ to form a `++' token).
> This is usually implemented by inserting whitespace so that tokenizing
> after expansion gives the same result.
> 
> >	- why no whitespace after `+'?
> 
> This is a bug in gcc-2.6.3.  It actually gives `` 1 +2 '', while

Thanx!  The inconsistency was what had me most confused!

> the version in gcc-2.7.2 gives                 ``1 + 2 ''.  The
> difference is important for
> 
> 	#define Y +
> 	int z;
> 	main() { printf("%d\n", +Y z); }
> 
> For gcc-2.6.3, ``+Y z'' expands to ``++  z'' so there is a bogus `++'
> token and the result is 1.  For gcc-2.7.2, it expands to ``+ +  z''
> and the result is 0.
> 
> Anyway, don't use `gcc -E' as a general purpose macro expander.
> `gcc -E -traditional' and /usr/bin/cpp work better.

Thanx!
--don



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199607110537.WAA17247>