digitalmars.D - Variable length arguement lists in D
- Ted Williams (5/5) May 21 2004 I have a stupid question: how does D handle variable length argument lis...
- Walter (6/9) May 21 2004 lists?
- Ted Williams (20/20) May 23 2004 I have tried to use the templates in the std.c.stdarg package. I cant g...
- J Anderson (11/32) May 23 2004 void TestArgs( char[] format, ... )
- Andrew Edwards (4/33) May 23 2004 Try this instead:
- J C Calvarese (34/62) May 23 2004 I don't know why your code doesn't compile. But here's an example that
- Hauke Duden (14/30) May 24 2004 You do realize that you don't HAVE to use aliases, don't you? D's
- Stewart Gordon (12/15) May 24 2004 IMHO, trying to do D stuff with a syntax feature that was presumably
I have a stupid question: how does D handle variable length argument lists? I've been over the D document and didn't see anything on it unless I missed something. Thanks, Ted
May 21 2004
"Ted Williams" <ted.wil.no.spam verizon.net> wrote in message news:c8m1t8$1gan$1 digitaldaemon.com...I have a stupid question: how does D handle variable length argumentlists?I've been over the D document and didn't see anything on it unless Imissedsomething.It handles them exactly as you'd handle them in C. You can also use std.c.stdarg.
May 21 2004
I have tried to use the templates in the std.c.stdarg package. I cant get the code to compile. The following snippet illustrates the problem: import std.c.stdarg; void TestArgs( char[] format, ... ) { va_list args; alias va_start!( char[] ) s; alias va_arg!(Object) a; s.va_start( args, format ); Object o = a.va_arg( args ); } When compiled I get the following errors: args.d(11): function va_start (va_list ap,char[]parmn) does not match argument types () args.d(11): Error: expected 2 arguments, not 0 args.d(11): no property 'va_start' for type 'void' What am I doing wrong? Thanks, Ted
May 23 2004
Ted Williams wrote:I have tried to use the templates in the std.c.stdarg package. I cant get the code to compile. The following snippet illustrates the problem: import std.c.stdarg; void TestArgs( char[] format, ... ) { va_list args; alias va_start!( char[] ) s; alias va_arg!(Object) a; s.va_start( args, format ); Object o = a.va_arg( args ); } When compiled I get the following errors: args.d(11): function va_start (va_list ap,char[]parmn) does not match argument types () args.d(11): Error: expected 2 arguments, not 0 args.d(11): no property 'va_start' for type 'void' What am I doing wrong? Thanks, Tedvoid TestArgs( char[] format, ... ) { va_list args; alias va_start!( char[] ) s; alias va_arg!(Object) a; s( args, format ); Object o = a( args ); } -- -Anderson: http://badmama.com.au/~anderson/
May 23 2004
Ted Williams wrote:I have tried to use the templates in the std.c.stdarg package. I cant get the code to compile. The following snippet illustrates the problem: import std.c.stdarg; void TestArgs( char[] format, ... ) { va_list args; alias va_start!( char[] ) s; alias va_arg!(Object) a; s.va_start( args, format ); Object o = a.va_arg( args ); }Try this instead: s( args, format ); Object o = a( args );When compiled I get the following errors: args.d(11): function va_start (va_list ap,char[]parmn) does not match argument types () args.d(11): Error: expected 2 arguments, not 0 args.d(11): no property 'va_start' for type 'void' What am I doing wrong? Thanks, Ted
May 23 2004
Ted Williams wrote:I have tried to use the templates in the std.c.stdarg package. I cant get the code to compile. The following snippet illustrates the problem: import std.c.stdarg; void TestArgs( char[] format, ... ) { va_list args; alias va_start!( char[] ) s; alias va_arg!(Object) a; s.va_start( args, format ); Object o = a.va_arg( args ); } When compiled I get the following errors: args.d(11): function va_start (va_list ap,char[]parmn) does not match argument types () args.d(11): Error: expected 2 arguments, not 0 args.d(11): no property 'va_start' for type 'void' What am I doing wrong? Thanks, TedI don't know why your code doesn't compile. But here's an example that Walter posted earlier that does seem to work: import std.c.stdarg; int foo(char *x, ...) { va_list ap; va_start!(typeof(x))(ap, x); printf("&x = %p, ap = %p\n", &x, ap); int i; i = va_arg!(typeof(i))(ap); printf("i = %d\n", i); long l; l = va_arg!(typeof(l))(ap); printf("l = %lld\n", l); uint k; k = va_arg!(typeof(k))(ap); printf("k = %u\n", k); va_end(ap); return i + l + k; } void main() { int j; j = foo("hello", 3, 23L, 4); printf("j = %d\n", j); assert(j == 30); } /* adapted from http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D/273 */ -- Justin (a/k/a jcc7) http://jcc_7.tripod.com/d/
May 23 2004
Ted Williams wrote:I have tried to use the templates in the std.c.stdarg package. I cant get the code to compile. The following snippet illustrates the problem: import std.c.stdarg; void TestArgs( char[] format, ... ) { va_list args; alias va_start!( char[] ) s; alias va_arg!(Object) a; s.va_start( args, format ); Object o = a.va_arg( args ); }You do realize that you don't HAVE to use aliases, don't you? D's templates have been upgraded a while back to allow convenient use without the need for those aliases. I'm just asking because lately I've seen aliases used a lot where they don't seem necessary. The following would work: void TestArgs( char[] format, ... ) { va_list args; va_start!(char[])(args, format ); Object o = va_arg!(Object)( args ); } Hauke
May 24 2004
Ted Williams wrote:I have tried to use the templates in the std.c.stdarg package. I cant get the code to compile.<snip>What am I doing wrong?IMHO, trying to do D stuff with a syntax feature that was presumably only put in for interfacing to C. (My guess is that the templates were put in there for the sake of completeness rather than anything else.) Mabye there are better solutions, or maybe it's better to wait for D to have its own, built-in support for VALs.... Stewart. -- My e-mail is valid but not my primary mailbox, aside from its being the unfortunate victim of intensive mail-bombing at the moment. Please keep replies on the 'group where everyone may benefit.
May 24 2004