實現類似printf這樣的函式

2022-03-02 08:38:37 字數 2363 閱讀 7924

在c/c++中,我們經常會需要實現類似printf這樣的函式,即函式的引數個數是不定的,這個時候就需要用到我們這篇文章講到的方法啦。

首先,我們要知道這種函式,如何來定義。比如我想實現乙個函式能夠支援 fun("%d",1);

那麼這個函式的定義實際上如下:

void fun(const

char *fmt, ...);

其中...的意思是說引數無法一一列出,所以用...代替,至於怎麼解,我們稍後再說。

比較特殊的一點是,如果你希望將上面的函式定義成乙個巨集,那麼這個巨集可以這樣寫:

#define fun(fmt, args...)    fun(fmt, ##args)
又假設你希望巨集能夠自動加上換行符,那麼可以這樣寫:

#define fun(fmt, args...)    fun(fmt"\n", ##args)
ok,那麼函式定義的問題我們就解決啦,但是怎麼來解呢?

c裡面提供了va_start,va_arg,va_end這樣幾個函式,解釋如下:

va_start使argp指向第乙個可選引數。va_arg返回引數列表中的當前引數並使argp指向引數列表中的下乙個引數。va_end把argp指標清為null。函式體內可以多次遍歷這些引數,但是都必須以va_start開始,並以va_end結尾。

可能只是這樣說並不是很清楚,我們舉個例子。

1、假設我們現在想要fun實現和printf一樣的功能,那麼實際上,我們是不需要把所有解析出來的,我們只有把引數原樣傳給printf即可,**如下:

void fun(const

char* fmt,...)

2、假設我們現在是要將傳入的引數都取出來,那麼我們就要用到va_arg了,**如下:

void fun(const

char* fmt,...)

其實到這裡大家也就不難發現,我們如何能遍歷所有的引數了,只要規定好最後乙個引數為乙個特殊字元,比如說-1,然後判斷到這個值就停止就行

void fun(const

char* fmt,...)

while(value!=-1);

va_end(ap);//

將ap置為null

}

ok,到此為止,可變引數的函式編寫應該也就很明了啦~

jpg 改 rar

在c/c++中,我們經常會需要實現類似printf這樣的函式,即函式的引數個數是不定的,這個時候就需要用到我們這篇文章講到的方法啦。

首先,我們要知道這種函式,如何來定義。比如我想實現乙個函式能夠支援 fun("%d",1);

那麼這個函式的定義實際上如下:

void fun(const

char *fmt, ...);

其中...的意思是說引數無法一一列出,所以用...代替,至於怎麼解,我們稍後再說。

比較特殊的一點是,如果你希望將上面的函式定義成乙個巨集,那麼這個巨集可以這樣寫:

#define fun(fmt, args...)    fun(fmt, ##args)
又假設你希望巨集能夠自動加上換行符,那麼可以這樣寫:

#define fun(fmt, args...)    fun(fmt"\n", ##args)
ok,那麼函式定義的問題我們就解決啦,但是怎麼來解呢?

c裡面提供了va_start,va_arg,va_end這樣幾個函式,解釋如下:

va_start使argp指向第乙個可選引數。va_arg返回引數列表中的當前引數並使argp指向引數列表中的下乙個引數。va_end把argp指標清為null。函式體內可以多次遍歷這些引數,但是都必須以va_start開始,並以va_end結尾。

可能只是這樣說並不是很清楚,我們舉個例子。

1、假設我們現在想要fun實現和printf一樣的功能,那麼實際上,我們是不需要把所有解析出來的,我們只有把引數原樣傳給printf即可,**如下:

void fun(const

char* fmt,...)

2、假設我們現在是要將傳入的引數都取出來,那麼我們就要用到va_arg了,**如下:

void fun(const

char* fmt,...)

其實到這裡大家也就不難發現,我們如何能遍歷所有的引數了,只要規定好最後乙個引數為乙個特殊字元,比如說-1,然後判斷到這個值就停止就行

void fun(const

char* fmt,...)

while(value!=-1);

va_end(ap);//

將ap置為null

}

ok,到此為止,可變引數的函式編寫應該也就很明了啦~

jpg 改 rar

printf函式的實現

printf函式是c語言庫函式中的輸出函式。在學習stm32過程用由於需要用到串列埠列印功能,但是程式原來的printf函式列印到串列埠時,出現了大量亂碼。無奈只能自己研究一下printf函式的構成。寫個乙個簡化版的printf函式。int myprintf const char format,wh...

printf函式實現

要實現printf函式需要考慮如下三點 1.如何告訴printf傳入引數的個數 引數個數不確定。2.printf如何訪問到這些引數。3.函式呼叫完成後,系統如何釋放在堆疊的引數。printf函式的定義 原型 int cdecl printf const char format,注 cdecl是c c...

實現自己的printf函式

在嵌入式開發中,常常會通過串列埠列印一些資訊到pc終端,這就需要實現自己的printf函式,下面介紹列印函式print的實現。print.h cpp view plain copy print?ifndef print h define print h void print char fmt,voi...