代码之家  ›  专栏  ›  技术社区  ›  Joshua Cheek

C编程:正向变量参数列表

  •  42
  • Joshua Cheek  · 技术社区  · 15 年前

    我正在尝试编写一个函数,它接受一个数量可变的参数,比如printf,做一些事情,然后将变量列表传递给printf。我不知道该怎么做,因为看起来必须将它们推到堆栈上。

    大概是这样的

    http://pastie.org/694844

    #include <stdio.h>
    #include <stdarg.h>
    
    void forward_args( const char *format , ... ){
      va_list arglist;
      printf( format, arglist );
    }
    
    
    int main (int argc, char const *argv[]){
      forward_args( "%s %s\n" , "hello" , "world" );  return 0;
    }
    

    有什么想法吗?

    4 回复  |  直到 13 年前
        1
  •  53
  •   Jason    14 年前

    不要将结果传递给 printf . 把它们传给 vprintf . VPrTNF 专门用于处理传入 va_list 争论。从Linux手册页:

    #include <stdio.h>
    
    int printf(const char *format, ...);
    int fprintf(FILE *stream, const char *format, ...);
    int sprintf(char *str, const char *format, ...);
    int snprintf(char *str, size_t size, const char *format, ...);
    
    #include <stdarg.h>
    
    int vprintf(const char *format, va_list ap);
    int vfprintf(FILE *stream, const char *format, va_list ap);
    int vsprintf(char *str, const char *format, va_list ap);
    int vsnprintf(char *str, size_t size, const char *format, va_list ap);
    

    注意后者是如何明确接受的 VAI表 参数,例如在函数中声明的参数 ... 在参数列表中。所以函数的声明如下:

    void forward_args( const char *format , ... ){
       va_list arglist;
       va_start( arglist, format );
       vprintf( format, arglist );
       va_end( arglist );
    }
    
        2
  •  4
  •   Tim Post Samir J M Araujo    13 年前

    我很确定你在找 va_start() / vprintf() / vsnprintf() / va_end() 不需要自己来实现这些。

        3
  •  2
  •   user202929    15 年前

    您将把arglist值传递给一个设计为使用它的函数。有关更多线索,请参阅stdarg和vprintf文档。

        4
  •  -1
  •   xenoterracide    15 年前

    我对如何实现这一点不太熟悉。我建议查看printf等函数的实现。存在多个开放源代码实现。glibc,uclibc(不确定bsd和opensolaris调用/使用的libc)。