在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(const2、假設我們現在是要將傳入的引數都取出來,那麼我們就要用到va_arg了,**如下:char* fmt,...)
void fun(const其實到這裡大家也就不難發現,我們如何能遍歷所有的引數了,只要規定好最後乙個引數為乙個特殊字元,比如說-1,然後判斷到這個值就停止就行char* fmt,...)
void fun(constok,到此為止,可變引數的函式編寫應該也就很明了啦~char* fmt,...)
while(value!=-1);
va_end(ap);//
將ap置為null
}
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(const2、假設我們現在是要將傳入的引數都取出來,那麼我們就要用到va_arg了,**如下:char* fmt,...)
void fun(const其實到這裡大家也就不難發現,我們如何能遍歷所有的引數了,只要規定好最後乙個引數為乙個特殊字元,比如說-1,然後判斷到這個值就停止就行char* fmt,...)
void fun(constok,到此為止,可變引數的函式編寫應該也就很明了啦~char* fmt,...)
while(value!=-1);
va_end(ap);//
將ap置為null
}
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...