簡體   English   中英

C:如何編寫像printf這樣的函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM