Index Home About Blog
From: torek@elf.bsdi.com (Chris Torek)
Newsgroups: comp.lang.c
Subject: Re: What is this???
Date: 4 Aug 1998 20:59:19 -0700

In an article my server has not received, James Hu wrote:
>>The only things that made the code non-conforming were the lack of
>>"..." and the missing call to va_end().  Putting the "..." into the
>>function made it necessary to use the improved ANSI C function
>>declaration syntax.

In article <35C7B099.E7850CC7@juno.com> Cyrand <cyrand@juno.com> wrote:
>Thanks.  Can I mix declaration syntaxes?

Yes.  You can also mix prototype declarations with old-style
definitions, e.g.,

	int	f1(int, char *);
	int	f2(void);

	int
	f1(i, p)
		int i;
		char *p;
	{
		/* ... */
		return 17;
	}

	int
	f2()
	{
		/* ... */
		return 42;
	}

You must, however, be aware of several restrictions.  First, all
variable-arguments functions must be prototyped, and their definitions
must use the newfangled 1989 prototype definition format (as James
Hu mentioned).  Second, old-style function definitions do not provide
prototypes and need not be verified against the prototype, so that,
for instance:

	int f3(int);
	int f3(p) char *p; { return *p; }

need not draw a diagnostic (despite being obviously broken).  Third
and probably most tricky, you must widen all the arguments according
to "the usual arithmetic conversions": char and short become int,
and float becomes double. This means that the correct prototype
for a function *defined* as:

	void
	f4(c, x)
		char c;
		float x;
	{
		/* ... */
	}

is:

	void f4(int, double);

and *not* the obvious but wrong "void f4(char, float)".

The fact that you can mix these means that you can do the following:

	#ifdef USE_PROTOTYPES
	#define PROTO(args) args
	#else
	#define PROTO(args) ()
	#endif

	int f1 PROTO((int, char *));
	int f2 PROTO((void));
	int f3 PROTO((int));
	int f4 PROTO((int, double));

This kind of PROTO macro (sometimes spelled just "P", or in
implementation-specific headers like those in 4.4BSD's /usr/include
directory, __P) allows you to get the benefits of prototypes while
still being able to compile on creaky old pre-1990 systems.
--
In-Real-Life: Chris Torek, Berkeley Software Design Inc
El Cerrito, CA	Domain:	torek@bsdi.com	+1 510 234 3167
Antispam notice: unsolicited commercial email will be handled at my
consulting rate; pyramid-scheme mail will be forwarded to the FTC.

Index Home About Blog