jon@cit-vax.Caltech.Edu (Jonathan P. Leech) (04/25/86)
Expires:
Sender:
Followup-To:
Organization : California Institute of Technology
Keywords:
    The <generic.h> header file defines constructs of the form
	#define name2(a,b) a\
	b
	#define name3(a,b,c) a\
	b\
	c
    with the intent of producing
	name2(a,b) => ab    etc.
    unfortunately the  System  V  cpp  (at  least  the	HP  and  ELXSI
versions) instead produces
	name2(a,b) => a b
    this is a serious problem in  every  case  I  can  find  of  these
constructs  being  used  -  specifically  <vector.h>.  I  don't  think
there's any way to produce this behavior with the System V cpp.
    Combined with the problem of '//' comments	not  being  elided  by
cpp, I think C++ should come with its own  preprocessor  (or  have  it
integrated into cfront).
    Additional	amusement:  try  running  cpp  with  input  from  your
keyboard and #include <generic.h>. Note that it now takes > 1  EOF  to
get out of cpp!
-- 
    Jon Leech (jon@csvax.caltech.edu || ...seismo!cit-vax!jon)
    Caltech Computer Science Graphics Group
    __@/guy@sun.UUCP (04/29/86)
> Try this fix for system V cpp: > > #define name2(a,b) a/**/b > #define name3(a,b,c) a/**/b/**/c > > This works because the system V cpp strips the comments from the input. So do earlier versions of Reiser's "cpp"; this is the "canonical" way of concatenating two arguments to a macro, and is heavily used in 4BSD. It has, however, two problems: 1) If you run your code through "lint", it won't work - "cpp" is run by "lint" with the "-C" flag, which tells it not to strip comments (for obvious reasons). 2) It is not a guaranteed property of the C language, but a quirk of the implementation, so it will not work in general. -- Guy Harris {ihnp4, decvax, seismo, decwrl, ...}!sun!guy guy@sun.arpa
kwh@bentley.UUCP (KW Heuer) (04/30/86)
In article <3597@sun.uucp> sun!guy (Guy Harris) writes: >> #define name2(a,b) a/**/b >It has, however, two problems: > > 1) If you run your code through "lint", it won't work I tried this example with "cpp -C" and it worked fine. I'd guess that cpp strips all comments in preprocessor directives reg Cdless of "-C". > 2) It is not a guaranteed property of the C language, but a > quirk of the implementation, so it will not work in > general. Agreed. Any application that depends on being able to do this is treading on thin ice. Karl W. Z. Heuer (ihnp4!bentley!kwh), The Walking Lint
rbm@sfsup.UUCP (R.B.Murray) (05/02/86)
> In article <3597@sun.uucp> sun!guy (Guy Harris) writes: > >> #define name2(a,b) a/**/b > >It has, however, two problems: > > > > 1) If you run your code through "lint", it won't work > > I tried this example with "cpp -C" and it worked fine. I'd guess that > cpp strips all comments in preprocessor directives regardless of "-C". > > > 2) It is not a guaranteed property of the C language, but a > > quirk of the implementation, so it will not work in > > general. > > Agreed. Any application that depends on being able to do this is treading > on thin ice. > > Karl W. Z. Heuer (ihnp4!bentley!kwh), The Walking Lint Agreed also. I also don't believe there is a standard and portable way to do this at the present time. However, the current draft of the ANSI C standard has an "offical" way to do this: #define name2(a,b) a##b The "##" is a (new) concatenation operator. Of course, this is only useful once a standard exists and everybody conforms to it. Also, ANSI may change their minds on the syntax of this feature. Rob Murray AT&T Summit, NJ