2012-08-12 57 views
2

我學會了使用函數庫stdarg.h來使函數具有未知數量的參數。下面是一個簡單的功能如何使用這個:有兩個主要約束C:如何編寫像printf這樣的函數

void print(int args,...){ 
    va_list ap; 
    va_start(ap, args); 
    int i = 0; 
    for(i=0; i<args; i++){ 
     printf("%d\n",va_arg(ap, int)); 
    } 
    va_end(ap); 
} 

基礎上面的代碼,我不知道怎麼printf可以克服:

1)固定數量的參數:意思是,在幾乎vardiac函數中,你需要包含一些參數。但是當我寫printf時,我不必包含這個數字。我曾經想過,在printf真的使用參數之前,它已經計算了前面的參數數量(通過計算第一個字符串中的數字%)。但是,我認爲這個解決方案有點不高效。它必須經過三個階段:計算參數個數,並將這些參數放入堆棧,最後將所有參數放入屏幕。

2)所有參數必須具有相同的類型:正如您在行中看到的那樣:printf("%d\n",va_arg(ap, int));。所以,列表中的每個參數必須具有相同的類型。而且據我們所知,這不是printf中的必備條件。您可以使用整數或字符串打印double。如果我們把所有這一切就像一個字符串,因此此行應該是錯誤的,因爲錯誤的語法:

printf("%d",4); //4 cannot treat by string 
printf("%d",'4'); // :)) I think this line is better 

請幫我上面的兩個問題解釋一下。

+0

http://www.gamedev.net/topic/386650-how-to-write-a-printf- like-function/ – 2012-08-12 10:05:30

+1

因爲,正如你所看到的,printf不能通過這樣的簡單循環工作,爲什麼你對它施加約束只適用於這樣一個簡單的循環? – 2012-08-12 10:13:52

回答

8

1)您自己回答了問題 - printf必須解析格式字符串以決定在va_list中需要的參數數量。

2)當它解析格式列表時,它將跟蹤在格式列表中指定的參數類型,並用適當的類型調用var_arg

另外see - 有趣的東西是在vfprintf(),這裏是鏈接的源代碼,雖然可能會有更易讀(如果效率更低)version

編輯:有便攜式實施方案的snprintf here的,看起來更具有可讀性(這裏Looking for C source code for snprintf()找到)

相關問題