【问题标题】:Variadic functions problems可变函数问题
【发布时间】:2013-07-18 10:47:12
【问题描述】:

让我们考虑这样的代码:

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

#ifdef debug
#undef debug
#endif

#define debug(format, ...) tpk(format, __VA_ARGS__)

void tpk(const char* format, ...)
{
  const unsigned int len = 1024;
  char buffer[len];
  va_list args;

  va_start(args, format);
  vsprintf(buffer, format, args);
  va_end(args);

  printf(buffer);
}


int main()
{
  debug("No, you don't! ",  "But I do! %d %s\n", 34, "blabla");
  return 0;
}

需要考虑的事项:

我有一些代码要调试,这就是为什么我必须取消调试(请不要问我为什么,因为项目中包含标头的方式有点混乱)。

不用担心缓冲区溢出等问题,这仅用于调试目的。

什么不工作:

我只收到No, you don't! 消息,仅此而已。但是,如果我从debug 中删除第一个参数,则可以很好地打印该消息。我在这里做错了什么?

更新:我犯了一个愚蠢的错误。我给出了一个格式字符串,它没有格式参数,因此一切正常。解决方法是修改函数:

#define debug(str, format, ...) tpk(str, format, __VA_ARGS__)

打印 str,然后在格式上使用可变参数函数。

【问题讨论】:

    标签: c macros c-preprocessor variadic-functions


    【解决方案1】:

    你所说的与:

    printf("No, you don't! ",  "But I do! %d %s\n", 34, "blabla");
    

    你能看出这是做什么的吗?

    提示:格式字符串是什么?

    【讨论】:

    • 除了这样的 printf 会产生编译错误 [: Oh God... not I see the error.
    【解决方案2】:

    在第一次调用debug函数时:

    debug("No, you don't! ",  "But I do! %d %s\n", 34, "blabla");
    

    第一个参数是 vsprintfformat 参数,它将解析它并尝试找到替换的内容。由于"No, you don't!" 没有可替换的内容,因此忽略其余参数。

    如果删除该部分,"But I do! %d %s\n" 包含将被替换的 %d%s

    【讨论】:

      猜你喜欢
      • 2021-08-23
      • 1970-01-01
      • 2011-08-04
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      相关资源
      最近更新 更多