有些系统,例如AIX,没有vasprintf和asprintf ,如果是做porting,有时需要写一个简单的代替。

代码如下:

 

 

 
  
  1. #if !defined(HAVE_VASPRINTF) 
  2. #if defined(WINDOWS) 
  3. int 
  4. vasprintf (char **ptr, const char *format, va_list ap) 
  5.   int len; 
  6.  
  7.   len = _vscprintf_p (format, ap) + 1; 
  8.   *ptr = (char *) malloc (len * sizeof (char)); 
  9.   if (!*ptr) 
  10.     { 
  11.       return -1; 
  12.     } 
  13.  
  14.   return _vsprintf_p (*ptr, len, format, ap); 
  15. #else 
  16. int 
  17. vasprintf (char **ptr, const char *format, va_list ap) 
  18.   va_list ap_copy; 
  19.  
  20.   /* Make sure it is determinate, despite manuals indicating otherwise */ 
  21.   *ptr = 0
  22.  
  23.   va_copy(ap_copy, ap); 
  24.   int count = vsnprintf(NULL, 0, format, ap); 
  25.   if (count >= 0) 
  26.         { 
  27.           char* buffer = malloc(count + 1); 
  28.           if (buffer != NULL) 
  29.                 { 
  30.                   count = vsnprintf(buffer, count + 1, format, ap_copy); 
  31.                   if (count < 0
  32.                         free(buffer); 
  33.                   else 
  34.                         *ptr = buffer
  35.                 } 
  36.         } 
  37.   va_end(ap_copy); 
  38.  
  39.   return count; 
  40.  
  41. #endif 
  42. #endif /* !HAVE_VASPRINTF */ 
  43.  
  44. #if !defined(HAVE_ASPRINTF) 
  45. int 
  46. asprintf (char **ptr, const char *format, ...) 
  47.   va_list ap; 
  48.   int ret; 
  49.  
  50.   *ptr = NULL
  51.  
  52.   va_start (ap, format); 
  53.   ret = vasprintf (ptr, format, ap); 
  54.   va_end (ap); 
  55.  
  56.   return ret; 
  57. #endif /* !HAVE_ASPRINTF */ 
下面是一个完整的例子:

 

 

 
  
  1. #include <stdio.h> 
  2. #include <stdarg.h> 
  3. #include <stdlib.h> 
  4. #include <string.h> 
  5.  
  6. int 
  7. myvasprintf (char **ptr, const char *format, va_list ap) 
  8.   va_list ap_copy; 
  9.  
  10.   /* Make sure it is determinate, despite manuals indicating otherwise */ 
  11.   *ptr = 0
  12.  
  13.   va_copy(ap_copy, ap); 
  14.   int count = vsnprintf(NULL, 0, format, ap); 
  15.   if (count >= 0) 
  16.     { 
  17.       char* buffer = malloc(count + 1); 
  18.       if (buffer != NULL) 
  19.         { 
  20.           count = vsnprintf(buffer, count + 1, format, ap_copy); 
  21.           if (count < 0
  22.             free(buffer); 
  23.           else 
  24.             *ptr = buffer
  25.         } 
  26.     } 
  27.   va_end(ap_copy); 
  28.  
  29.   return count; 
  30.  
  31.  
  32. void 
  33. print_warning (char **buffer, const char *fmt, ...) 
  34.   va_list ap; 
  35.   va_start (ap, fmt); 
  36.   myvasprintf (buffer, fmt, ap); 
  37.   va_end (ap); 
  38.  
  39. int main() 
  40.   char *buffer; 
  41.   int a = 99999
  42.   int b = 9
  43.   print_warning(&buffer, "hello, world, %d * %d = %d, %s\n", a, b, a * b, "finished!!" ); 
  44.  
  45.   printf(buffer); 
  46.   return 0; 

上述代码的执行结果如下:

hello, world, 99999 * 9 = 899991, finished!!