2013-07-18 98 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