2011-06-25 67 views
-3

問題15.4長度:http://c-faq.com/varargs/varargs1.htmlcomp.lang.c常見錯誤?計算variadically格式化字符串

在示例代碼中出現,他們似乎認爲在va_arg返回NULL如果列表的末尾已到達:

len = strlen(first); 

va_start(argp, first); 

while((p = va_arg(argp, char *)) != NULL) 
    len += strlen(p); 

va_end(argp); 

但va_arg的文檔明確表示,情況並非如此,並且va_arg會高興地越過列表的末尾。這與我嘗試模仿上述代碼並獲得段錯誤的經驗是一致的。

+0

-1因爲沒有閱讀完整的文章 – pmg

+0

我明白了,有道理。每當我學到C的新東西時,一旦我停止了抵抗,語言的美妙之處就會增加更多 – Xamuel

+2

以後任何人都會在這個線程中發現一個評論:如果你想自動添加NULL(假設你正在使用CPP作爲你的編譯器),你可以用宏這樣做:'#define myformatter(first,...)myformatter_(first,## __VA_ARGS__,NULL)' – Xamuel

回答

2

事實上,va_arg沒有提到在列表的第nd處返回NULL

如果沒有一個參數,或者如果 類型與類型不實際的一個參數的 兼容(如 按照默認 參數促銷推廣),隨機誤差 會發生。

但FAQ說:

到vstrcat調用看起來像

char *str = vstrcat("Hello, ", "world!", (char *)NULL); 

這意味着它們假設主叫方將通過NULL作爲最後一個參數來信號名單末尾

1

注意如何vstrcat,在the c-faq article,被稱爲:

char *str = vstrcat("Hello, ", "world!", (char *)NULL); 

最後一個參數是NULL。這就是va_arg返回

2

它們在調用vstrcat()時傳遞一個NULL指針。

A call to vstrcat looks something like 

    char *str = vstrcat("Hello, ", "world!", (char *)NULL);