我學會了使用函數庫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
請幫我上面的兩個問題解釋一下。
http://www.gamedev.net/topic/386650-how-to-write-a-printf- like-function/ – 2012-08-12 10:05:30
因爲,正如你所看到的,printf不能通過這樣的簡單循環工作,爲什麼你對它施加約束只適用於這樣一個簡單的循環? – 2012-08-12 10:13:52