让我们考虑一下这样的代码:
#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,然后在格式上使用可变参数函数。
答案 0 :(得分:2)
你所说的与以下内容没有什么不同:
printf("No, you don't! ", "But I do! %d %s\n", 34, "blabla");
你能看到它的作用吗?
提示:格式字符串是什么?
答案 1 :(得分:2)
在第一次调用debug
函数时:
debug("No, you don't! ", "But I do! %d %s\n", 34, "blabla");
第一个参数是format
的{{1}}参数,它将解析它并尝试找到要替换的内容。由于vsprintf
不包含任何内容,因此忽略其余参数。
如果删除该部分,则"No, you don't!"
包含将被替换的"But I do! %d %s\n"
和%d
。