将可变数量的参数传递给别名函数

时间:2010-02-05 11:18:48

标签: c++ variables arguments variadic-functions argument-passing

采用类似printf的函数接受可变数量的参数我想要做的是将这些可变数量的函数传递给子函数而不改变它们的顺序。这方面的一个例子是将printf函数别名化为一个名为console ...的函数

#include <stdio.h>

void console(const char *_sFormat, ...);

int main () {
    console("Hello World!");
    return 0;
}

void console(const char *_sFormat, ...) {
    printf("[APP] %s\n", _sFormat);
}

如果我做了例如console("Hello %s", sName),我希望将名称传递给printf函数,但它必须能够继续接受像printf那样的可变数量的参数。 / p>

2 个答案:

答案 0 :(得分:4)

这是你想要的:

#include <stdio.h>
#include <stdarg.h>

void console(const char *_sFormat, ...);

int main () {
    console("Hello World!");
    return 0;
}

void console(const char *_sFormat, ...) {
    va_list ap;
    va_start(ap, _sFormat);
    printf("[APP] ");
    vprintf(_sFormat, ap);
    printf("\n");
    va_end(ap);
}

答案 1 :(得分:2)

还有另一个问题(由gf指出) - 您应该连接printf中的字符串和_sFormat参数 - 我怀疑printf是递归的 - 因此,第一个参数中的格式语句不会被读取!

因此,这样的解决方案可能会更好:

#include <stdarg.h>

void console(const char *_sFormat, ...)
{
  char buffer[256];

  va_list args;
  va_start (args, _sFormat);
  vsprintf (buffer,_sFormat, args);
  va_end (args);

  printf("[APP] %s\n", buffer);
}

使用的类型/功能: