Path: utzoo!attcan!uunet!seismo!sundc!pitstop!sun!gorodish!guy From: guy@gorodish.Sun.COM (Guy Harris) Newsgroups: comp.unix.wizards Subject: Re: #defines with variable # arguments Message-ID: <52949@sun.uucp> Date: 12 May 88 01:12:23 GMT References: <2855@phoenix.Princeton.EDU> Sender: news@sun.uucp Distribution: na Lines: 38 > Are there any versions of cpp which allow one to define macros which > accept variable numbers of arguments? None that I know of. There are tricks that can be used for this: #define Sprintf(x) sprintf x main() { char buf[40]; Sprintf((buf, "%d", 33)); Sprintf((buf, "%d %d", 33, 66)); } but this requires the extra layer of parentheses; I presume you want a "magic bullet" that requires few source changes to the program you're trying to convert. Neither K&R nor ANSI C have any syntax for macros of this sort. > I keep wishing for this every time I try to move code developed using sysV > sprintf to a BSD system, Your best bet here is just to redo the code not to depend on the return value of "sprintf". Sad, but true. > Does anyone know why the folks at Berkeley chose to have their > sprintf return its first argument, instead of the number of characters > printed? Nobody can possibly know that, because they weren't the ones who made that decision. "sprintf" worked that way in V7 (although I don't think it was so documented) - in fact, the System III SCCS code was written assuming this behavior, which is kind of amusing since the System III "sprintf" returned the number of characters generated.... (Some BSD/S5 differences are really V7/S5 differences; questions about why *those* differences exist should be directed to AT&T, since they were responsible for both systems.)