c - 如何使用省略号 (...)

标签 c printf

<分区>

我想用 c 语言编写一个使用省略号 (...) 参数的函数,但我不知道它是如何工作的。

我想做这样的事情:

void error(const char* fmt, ...);

void error(const char* fmt, ...) {
  // fprintf(stderr, fmt, ...); << didnt work!
  fprintf(stderr, fmt, /* ??? */);
}

我想像“普通”printf() 调用一样使用它。

error("bla");
error("nr: %d", 42);
error("pi: %f", 3.1415);

我怎样才能访问省略号作为空洞的东西并将它传递给下一个函数?

最佳答案

省略号不以您可以直接处理或转发的任何方式构成“包”。管理与任何函数参数都不匹配的函数参数的唯一方法是通过 <stdarg.h>特点。

这意味着对于每个变量函数foo你也应该总是有一个相应的功能vfoo消耗 va_list .例如:

#include <stdarg.h>

void foo(const char * fmt, ...);
void vfoo(const char * va_list ap);

前者通常根据后者来实现:

void foo(const char * fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    vfoo(fmt, ap);
    va_end(ap);
}

幸运的是,printf函数族遵循这些规则。所以,当你想外包给一个printf函数,你实际使用的是对应的底层vprintf版本:

void error(const char * fmt, ...)
{
    do_stuff();

    va_list ap;
    va_start(ap, fmt);

    vfprintf(stderr, fmt, ap);

    va_end(ap);
}

当然,按照同样的规则,你应该写一个 verror首先运行并进行调用vprintf :

void verror(const har * fmt, va_list ap)
{
    do_stuff(); 
    vfprintf(stderr, fmt, ap);
}

关于c - 如何使用省略号 (...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30440061/

相关文章:

c++ - 如何监控包含所有子文件夹和文件的文件夹?

string - 如何 fmt.Printf 带有千位逗号的整数

c - 在 C 奇怪的输出中写入和读取 CSV 文件

无法将 float 或 double 转换为 char 数组 (sprintf)

c - 如何确定 C 调试错误中的每周工资;

c - C中删除动态数组的元素

c - fopen 后检测文件删除

c - 二进制 I/O,在文件中查找要修改的特定字节

c++ - 为什么 CUDA 中的外部共享内存存在未定义的行为?

我可以假设所有平台都支持 `printf` 的颜色吗?