2013-07-18 72 views
0

让我们考虑这样的代码:可变参数的功能问题

#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和后的格式,使用可变参数的功能。

回答

2

什么你说是没有什么不同:

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

你可以看到,做什么?

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

+0

除了这样的printf会产生编译错误[: 哦,上帝...不是我看到错误。 – Melon

2

在第一次调用debug功能:

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

的第一个参数是format论据vsprintf,将分析它,并试图找到代替的东西。由于"No, you don't!"不包含任何要替换的值,因此其余参数将被忽略。

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