1

Visual C ++には似たようなものがあり__builtin_va_arg_packますか?

この組み込み関数は、インライン関数のすべての匿名引数を表します。これは、常にインライン化されるインライン関数でのみ使用でき、 属性((always_inline))または属性((gnu_inline))externインライン関数を使用する関数などの個別の関数としてコンパイルされることはありません。可変引数を持つ他の関数に最後の引数としてのみ渡す必要があります。これは、プリプロセッサマクロの使用が望ましくない場合に、可変引数関数の小さなラッパーインラインを作成する場合に役立ちます。例えば:

      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 に答える