cpp problem found by imake
Jakub Jelinek
jakub@redhat.com
Tue May 2 22:57:00 GMT 2000
On Tue, May 02, 2000 at 09:05:36AM -0700, Zack Weinberg wrote:
> On Tue, May 02, 2000 at 06:02:58PM +0200, Jakub Jelinek wrote:
> > Hi!
> >
> > Current cpp does not also like the following snippet
> > (distilled from XF4.0 cf/ stuff):
> >
> > #define Concat3(a,b,c) a##b##c
> > #define Header /usr/include/stdio
> > #define Include Concat3(<,Header,.h>)
> > #include Include
>
> This came up before. It's undefined behavior - token paste produces
> an illegal token. They should do something like
>
> #define Header /usr/include/stdio
> #define HNAME(x) _HNAME(x.h)
> #define _HNAME(x) #x
> #define Include HNAME(Header)
> #include Include
>
> Note that the HP/UX and Irix cc are reported to reject this construct too.
>
> [I know there is a bug in that the special treatment of <...> extends
> to macros expanded on the #include line, but this particular example
> is still undefiend behavior.]
Ok, fine for ANSI cpp, what about traditional:
#define Concat3(a,b,c)a/**/b/**/c
#define Header /usr/include/stdio
#define Include Concat3(<,Header,.h>)
#include Include
does not work, neither does
#define Header /usr/include/stdio
#define MakeHeader(x) "x.h"
#define Include MakeHeader(x)
#include Include
nor anything else I've tried. Can you please tell me what might do the job
in traditional (best what would work with both old cccp and cpp)?
BTW: What's the reason why
#define Concat(a,b)a/**/b
#define Header /usr/include/stdio
Concat(Header,.h)
Concat(/usr/include/stdio,.h)
produces different output in cpp -traditional to old cccp -traditional
(which has identical output to /usr/ccs/lib/cpp in Solaris and /lib/cpp in
Irix)?
cpp puts an additional space at the beginning of each line and a space
between stdio and .h on the first line.
Jakub
More information about the Gcc-bugs
mailing list