home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / lang / c / 11427 < prev    next >
Encoding:
Internet Message Format  |  1992-07-22  |  2.1 KB

  1. Path: sparky!uunet!haven.umd.edu!mimsy!peyote
  2. From: peyote@umiacs.umd.edu (Gary W. Flake)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: Variable arguments & macros...
  5. Keywords: macros, varargs
  6. Message-ID: <59160@mimsy.umd.edu>
  7. Date: 22 Jul 92 13:18:06 GMT
  8. References: <markkj.711771545@munagin>
  9. Sender: news@mimsy.umd.edu
  10. Organization: UMIACS, University of Maryland, College Park, MD 20742
  11. Lines: 66
  12.  
  13. markkj@mullian.ee.mu.OZ.AU (Mark Johnston) writes:
  14. >
  15. >    I'm wondering if anyone has any really devious ways of writing macros
  16. >so that variable arguments can be used.  The problem is that I have a function
  17. >that does error handling for a program, and it takes variable arguments:
  18. >
  19. >int writeErrorMsg(int quit, char *file, int line, char *format, ...)
  20. >{
  21. > /* ... */
  22. >}
  23. >    The macros are:
  24. >
  25. >#define error(x) writeErrorMsg(0, __FILE__, __LINE__, x)
  26. >#define fatal(x) writeErrorMsg(1, __FILE__, __LINE__, x)
  27. >
  28. >
  29. >    Last but not least, I'm using the functions in the following way:
  30. >
  31. >    error("The error code is %1d.", errCode);
  32. >
  33.  
  34.  
  35. I wouldn't recommend this for everyone but...
  36.  
  37. MERGE(x,y) will exand both x and y THEN concat them. There are other
  38. ways to doing this, but this is the only one that has always worked
  39. for me.
  40.  
  41. #define  MERGE(x,y)          MERGE ## _KLUDGE(x,y)
  42. #define  MERGE_KLUDGE(x,y)   x     ## y
  43.  
  44. now...
  45.  
  46. #define  ARG(x) , (x)
  47. #define  __ARG(x) (x)
  48. #define error(x) writeErrorMsg(0, __FILE__, __LINE__, MERGE(__,x))
  49. #define fatal(x) writeErrorMsg(1, __FILE__, __LINE__, MERGE(__,x))
  50.  
  51. The variable argument portion of the macro should have no commas, e.g.
  52.  
  53. error(ARG("foo = %d -- bar = %d) ARG(fooness) ARG(barness));
  54.  
  55. expands too:
  56.  
  57. writeErrorMsg(0, "foo.c", 666,
  58.    MERGE(__, ARG("foo = %d -- bar = %d") ARG(fooness) ARG(barness))
  59.  
  60. ->
  61.  
  62. writeErrorMsg(0, "foo.c", 666,
  63.    __ARG("foo = %d -- bar = %d) ARG(fooness) ARG(barness))
  64.  
  65. ->
  66.  
  67. writeErrorMsg(0, "foo.c", 666, ("foo = %d -- bar = %d), (fooness), (barness))
  68.  
  69.  
  70. This'll work in gcc.  
  71.  
  72. Don't you just love the preprocesser!
  73.  
  74. Cheers,
  75. Gary
  76. -- 
  77. Spoken: Gary W. Flake  Domain: peyote@umiacs.umd.edu  UUCP: uunet!mimsy!peyote
  78. Phone: +1-301-405-6757 USPS: UMIACS, U. of Maryland,  College Park, MD 20742
  79.