![](/img/trans.png)
[英]How to use assembly to write a console(or just like printf() function) in uboot before set up C environment?
[英]C: how to write a function like printf
我學會了使用庫stdarg.h
來使用具有未知數量參數的函數。 這是一個簡單的函數如何使用:
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函數中,你需要包含args的數量。 但是當我寫printf
,我不必包含這個數字。 我認為在printf
真正使用參數之前,它已經計算了之前的參數數量(通過計算第一個字符串中的數字%)。 但同樣,我認為這個解決方案有點效率不高。 它必須通過三個pharses:計算參數數量,並將這些參數放入堆棧,最后將所有參數放入屏幕。
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
請幫我解釋一下上面兩個問題。
1)你自己回答了這個問題 - printf
必須解析格式字符串以決定在va_list中要采用多少個參數。
2)當它解析格式列表時,它將跟蹤格式列表中指定的參數類型,並使用適當的類型調用var_arg
。
另請參閱 - 有趣的東西是在vfprintf()
,這里是鏈接源,盡管可能有更易讀(如果效率更低)的版本 。
編輯:有便攜式實施方案的snprintf的位置 ,看起來更具有可讀性(這里找到正在尋找的snprintf C源代碼() )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.