Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 20 Oct 2002 14:34:16 -0600 (MDT)
From:      "M. Warner Losh" <imp@bsdimp.com>
To:        freebsd-standards@FreeBSD.ORG, freebsd-hackers@FreeBSD.ORG
Subject:   Re: Problem detecting POSIX symbolic constants
Message-ID:  <20021020.143416.109047247.imp@bsdimp.com>
In-Reply-To: <20021020204920.C8767@chiark.greenend.org.uk>
References:  <20021016121455.A3711@chiark.greenend.org.uk> <20021020.134409.73085448.imp@bsdimp.com> <20021020204920.C8767@chiark.greenend.org.uk>

next in thread | previous in thread | raw e-mail | index | archive | help
In message: <20021020204920.C8767@chiark.greenend.org.uk>
            Tony Finch <dot@dotat.at> writes:
: On Sun, Oct 20, 2002 at 01:44:09PM -0600, M. Warner Losh wrote:
: > Tony Finch <dot@dotat.at> writes:
: > : On Sat, Oct 12, 2002 at 01:20:03PM -0700, Terry Lambert wrote:
: > : > 
: > : > #if _DEFINED_SUPPORTED  && defined(SOMETHING)
: > : 
: > : That's a syntax error in pre-ANSI preprocessors (unless defined() is
: > : #defined), which won't be bypassed by evaluation shortcutting since
: > : evaluation happens after parsing.
: > 
: > Actaully, it is only a syntax error on some really really really old
: > cpp.  The sun cpp on SunOS 4.x, for example, wasn't ANSI, but did grok
: > the above construct.
: 
: Yes, the C manual in -CURRENT which sates from 1986 documents defined().
: I haven't found any versions of the manual between 1975 (h0h0 C) and
: then, and I don't have a copy of K&R 1 :-/

I can verify first hand that SunOS 3.5 (and I think 3.2) behaved the
same way as SunOS 4.1.3 did.

My copy of K&R 1 is silent on this issue (well, as I recall, I can't
find my K&R1 at the moment), which means defined isn't likely to be
there.  My copy of the Bell Laboratories Technical Journal October
1984 (Vol 63 No.8 Part 2) says, in "The Evolution of C -- Past and
Future" by L. Rosler, section 5.9 Compiler Control Lines:

	The conditional-compile facility (Ref 2. Sect 12.3) has been
	enhanced in two ways.

	To facilitate selection of one among a set of choices, any
	number of control lines of the form
		#elif constant-expression
	may now appear on any line between a #if line and its closing
	#endif (or #else if present).

	The new pseudofunction defined(identifier) may be used in the
	constant-expression part of a #if or #elif control line, with
	value 1 if the identifier is currently defined in the
	preprocessor, and 0 otherwise.  Thus #ifdef identifier is
	equivalent to #if defined(identifier) and #ifndef identifier
	is equivalent to #if !defined(identifier).  The older forms
	will be retained for compatibility, as they are deeply
	entrenched in existing code.  But, as they are superfluous,
	equivalents to #ifdef will not be provided for the new
	construction #elif.

Ref 2 looks to be K&R1:
	2. B. W. Kernighan and D. M. Ritchie, The C Programming
	Language, Englewood Cliffs, NJ.: Prentice Hall, 1978.

So it looks like it was added just after K&R1, but early enough that
4.2BSD had it (and maybe earlier), which would explain why SunOS groks
it.  1984 definitely pre-dates the standard (and in fact this same
article goes on to describe varadic functions with a syntax that is
different than what was finally adapoted).

Warner

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




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