代码之家  ›  专栏  ›  技术社区  ›  Totonga

是否可以直接传递C省略号调用?

c c++
  •  5
  • Totonga  · 技术社区  · 14 年前
    void printLine(const wchar_t* str, ...) 
    {
      // have to do something to make it work
      wchar_t buffer[2048];        
      _snwprintf(buffer, 2047, ????);
      // work with buffer
    }
    
    printLine(L"%d", 123);
    

    我试过

      va_list vl;
      va_start(vl,str);
    

    像这样的事情,但我没有找到解决办法。

    4 回复  |  直到 14 年前
        1
  •  9
  •   t0mm13b    14 年前

    这里有一个简单的C代码,它可以完成这项工作,您必须包含stdarg.h。

    void panic(const char *fmt, ...){
       char buf[50];
    
       va_list argptr; /* Set up the variable argument list here */
    
       va_start(argptr, fmt); /* Start up variable arguments */
    
       vsprintf(buf, fmt, argptr); /* print the variable arguments to buffer */
    
       va_end(argptr);  /* Signify end of processing of variable arguments */
    
       fprintf(stderr, buf); /* print the message to stderr */
    
       exit(-1);
    }
    

    典型的调用是

    panic("The file %s was not found\n", file_name); /* assume file_name is "foobar" */
    /* Output would be: 
    
    The file foobar was not found
    
    */
    

    希望这有帮助, 最好的问候, 汤姆。

        2
  •  5
  •   Ruddy    14 年前

    你想用的是 vsprintf 它接受 va_list 论证,有样本 链接中的msdn代码。

    编辑: 你应该考虑 _vsnprintf 这将有助于避免vsprintf愉快地创建的缓冲区溢出问题。

        3
  •  2
  •   Matt Joiner    14 年前

    通常有一个调用到变量args版本的函数,它接受 va_list . 例如 _snwprintf 内部通话 _vsnwprintf 试着打那个电话。

        4
  •  2
  •   jamesdlin    14 年前

    其他人已经把你指给 vprintf -如果您想熟悉其他FAQ条目,那么comp.lang.c FAQ也会回答这个问题(这并不奇怪)。(依我看,它们值得一读。)

    How can I write a function that takes a format string and a variable number of arguments, like printf, and passes them to printf to do most of the work?