Boston Linux & Unix (BLU) Home | Calendar | Mail Lists | List Archives | Desktop SIG | Hardware Hacking SIG
Wiki | Flickr | PicasaWeb | Video | Maps & Directions | Installfests | Keysignings
Linux Cafe | Meeting Notes | Linux Links | Bling | About BLU

BLU Discuss list archive


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

C Macro question



Jerry,
    thanks for the code snipet.  That provided exactly what I needed
 :)

                 -fjr

----Original Message-----
   >From:     	Jerry Feldman <gaf at blu.org>
   >To:         	discuss at blu.org
   >Subj:     	Re: C Macro question 
   >Sent:    	Sunday, June 16, 2002 6:11 PM
   >
   >I write C code according to the C standard. vfprintf(3) is a
 standard 
   >function available on all standard C implementations. C
 preprocessor macros 
   >according to the standard do not support variable arguments. There
 are ways 
   >to get around this, but I dod not want to be overly complicated.
   >"Derek D. Martin" wrote:
   >> -----BEGIN PGP SIGNED MESSAGE-----
   >> Hash: SHA1
   >> 
   >> At some point hitherto, Jerry Feldman hath spake thusly:
   >> > In short, macros do not support variable arguments, but....
   >> 
   >> Well, at least with Gnu tools, yes they do.  See my previous
 post.  I
   >> haven't tried this with any proprietary compiler, as I currently
 don't
   >> have access to any.
   >> 
   >> > You are better off using a C function for that (assume you
 include 
   >> > stdarg.h).
   >> > int printerr(const star *fmt, ...)
   >> > {
   >> > 	va_list ap;
   >> > 	int rv;
   >> > 	time_t now = time(NULL);
   >> > 	char msg[SOMESIZE];
   >> > 	va_start(ap, fmt);
   >> > 	sprintf(msg, "%s - ERROR: %s", ctime(&now), fmt);
   >> > 	rv = vfprintf(logfile, msg, ap);
   >> > 	return rv;
   >> > }
   >> 
   >> This reminds me; your implementation (if you're not using glibc)
 may
   >> not have vsnprintf().  If you're writing to a file, you can use
 a
   >> method something like gaf's above.  Most implementations have
   >> vfprintf() which make that possible.
   >> 
   >> If you're using some other API, such as to log a message to
 syslog,
   >> that won't work (because you need to have the message you're
 logging
   >> in a buffer to pass to syslog()).  In such a case, you can
 borrow the
   >> source for vsnprintf() from the glibc source.  Many Gnu programs
   >> explicitly include the source for functions added by the most
 recent C
   >> standards (such as vsnprintf()), as many older implementations
 don't
   >> have them.  Chances are fair that if you've got the source for
 any Gnu
   >> program laying around, the code for vsnprintf() might be with
 it.
   >> 
   >> - -- 
   >> Derek Martin               ddm at pizzashack.org    
   >> - ---------------------------------------------
   >> I prefer mail encrypted with PGP/GPG!
   >> GnuPG Key ID: 0x81CFE75D
   >> Retrieve my public key at http://pgp.mit.edu
   >> Learn more about it at http://www.gnupg.org
   >> -----BEGIN PGP SIGNATURE-----
   >> Version: GnuPG v1.0.6 (GNU/Linux)
   >> Comment: For info see http://www.gnupg.org
   >> 
   >> iD8DBQE9DPtedjdlQoHP510RAoCDAJ9229nJvYv+0++OEzk9iYcuuT9AiwCgj29r
   >> BOyJKvoFQHg74CzRL9giFKQ=
   >> =02N5
   >> -----END PGP SIGNATURE-----
   >> _______________________________________________
   >> Discuss mailing list
   >> Discuss at blu.org
   >> http://www.blu.org/mailman/listinfo/discuss
   >> 
   >
   >-- 
   >Jerry Feldman <gaf at blu.org>
   >Boston Linux and Unix user group
   >http://www.blu.org PGP key id:C5061EA9
   >PGP Key fingerprint:053C 73EC 3AC1 5C44 3E14 9245 FB00 3ED5 C506
 1EA9
   >
   >
   >_______________________________________________
   >Discuss mailing list
   >Discuss at blu.org
   >http://www.blu.org/mailman/listinfo/discuss
   >
   >

begin 600 Blank Document.psw
`
end





BLU is a member of BostonUserGroups
BLU is a member of BostonUserGroups
We also thank MIT for the use of their facilities.

Valid HTML 4.01! Valid CSS!



Boston Linux & Unix / webmaster@blu.org