1

Visual C++ 有类似的东西__builtin_va_arg_pack吗?

此内置函数表示内联函数的所有匿名参数。它只能用于始终内联的内联函数,从不编译为单独的函数,例如使用 属性(( always_inline )) 或属性(( gnu_inline )) 外部内联函数的函数。它只能作为最后一个参数传递给带有可变参数的其他函数。当不希望使用预处理器宏时,这对于为可变参数函数编写小型包装内联很有用。例如:

      extern int myprintf (FILE *f, const char *format, ...);
      extern inline __attribute__ ((__gnu_inline__)) int
      myprintf (FILE *f, const char *format, ...)
      {
        int r = fprintf (f, "myprintf: ");
        if (r < 0)
          return r;
        int s = fprintf (f, format, __builtin_va_arg_pack ());
        if (s < 0)
          return s;
        return r + s;
      }
4

1 回答 1

1

从来没听说过。但是这里不需要使用 gcc 扩展,使用 vfprintf 代替:

  int myprintf (FILE *f, const char *format, ...)
  {
    va_list ap;
    va_start(ap, format);
    int r = fprintf (f, "myprintf: ");
    if (r < 0)
      return r;
    int s = vfprintf (f, format, ap);
    va_end(ap);
    if (s < 0)
      return s;
    return r + s;
  }
于 2012-12-20T12:37:24.383 回答