code_junkie

Are there gotchas using varargs with reference parameters

Nov 11th, 2011
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.09 KB | None | 0 0
  1. AnsiString working(AnsiString format,...)
  2. {
  3. va_list argptr;
  4. AnsiString buff;
  5.  
  6. va_start(argptr, format);
  7. buff.vprintf(format.c_str(), argptr);
  8.  
  9. va_end(argptr);
  10. return buff;
  11. }
  12.  
  13. AnsiString broken(const AnsiString &format,...)
  14. {
  15. ... the rest, totally identical ...
  16. }
  17.  
  18. AnsiString s1, s2;
  19. s1 = working("Hello %s", "World");
  20. s2 = broken("Hello %s", "World");
  21.  
  22. va_start(argptr, format);
  23.  
  24. argptr = (va_list) (&format+1);
  25.  
  26. AnsiString working_ptr(const AnsiString *format,...)
  27. {
  28. ASSERT(format != NULL);
  29. va_list argptr;
  30. AnsiString buff;
  31.  
  32. va_start(argptr, format);
  33. buff.vprintf(format->c_str(), argptr);
  34.  
  35. va_end(argptr);
  36. return buff;
  37. }
  38.  
  39. ...
  40.  
  41. AnsiString format = "Hello %s";
  42. s1 = working_ptr(&format, "World");
  43.  
  44. AnsiString working_dummy(const AnsiString &format, int dummy, ...)
  45. {
  46. va_list argptr;
  47. AnsiString buff;
  48.  
  49. va_start(argptr, dummy);
  50. buff.vprintf(format.c_str(), argptr);
  51.  
  52. va_end(argptr);
  53. return buff;
  54. }
  55.  
  56. ...
  57.  
  58. s1 = working_dummy("Hello %s", 0, "World");
  59.  
  60. alloca(sizeof(class));
  61. memcpy(stack, &instance, sizeof(class);
Add Comment
Please, Sign In to add comment