[net.lang.c] Varargs in new C standard

howard@metheus.UUCP (Howard A. Landman) (08/10/84)

How about using a well-understood English language convention to indicate
optional arguments?  Namely, the ellipsis, "...".  For example:

	printf(char *, ...);
	fprintf(FILE *, char *, ...);
	sprintf(char *, char *, ...);

Isn't this perfectly clear?  I can't see any way that this would conflict
with any other C keywords or usage.  Is there something I'm missing?

	Howard A. Landman
	ogcvax!metheus!howard	(until August 14th)

	"If I knew the way, I would take you home"

trt@rti-sel.UUCP (08/10/84)

None of the proposals I have seen would fix the 'execl' problem:
	execl("/bin/date", "date", 0);	/* should be (char *)0 */

FIX 1 (a varying number of arguments of specified type):
	int execl(char * ...);	/* no comma! (yup, obscure) */
to mean 0 or more arguments of type char *, whereas
	int printf(char *, ...);
means a char * followed by 0 or more arguments of unknown type.
The correct specification for execl would really be:
	int execl(char *, char * ...);	/* execl has >= 1 argument */
I suppose one might have a strange function like:
	int weird(int ..., float, ..., char *);
which means ... oh forget it.  Pity the compiler writers.

FIX 2 (overloaded(?) declarations):
	int execl(char *); int execl(char *, char *);
	int execl(char *, char *, char *); ...

I prefer FIX 1 since it is more compact and covers all the varargs
programs I can think of.  It would be reasonable to require
that the '...' must appear last (to simplify implementation).
	Tom Truscott

henry@utzoo.UUCP (Henry Spencer) (08/12/84)

My understanding was that the ellipsis ("...") was among the ideas for
varargs syntax that the ANSI group looked at.  I don't know why they
rejected this particular one, but they *did* consider it.
-- 
				Henry Spencer @ U of Toronto Zoology
				{allegra,ihnp4,linus,decvax}!utzoo!henry

guy@rlgvax.UUCP (Guy Harris) (08/14/84)

Another person had also mentioned the use of an ellipsis to indicate a function
which takes a number (possibly zero) of "fixed" arguments, and a number
of "variable" arguments after it; i.e.,

	int fprintf(FILE *, char *, ...);

This is how it's done in C++, according to the C++ Reference Manual.

	Guy Harris
	{seismo,ihnp4,allegra}!rlgvax!guy