要實現printf函式需要考慮如下三點:
1.如何告訴printf傳入引數的個數:引數個數不確定。
2.printf如何訪問到這些引數。
3.函式呼叫完成後,系統如何釋放在堆疊的引數。
printf函式的定義:(原型)
int _cdecl printf(const char* format,...);
注:_cdecl是c/c++預設呼叫方式。
_cdecl呼叫約定:1.引數從右自左依次入棧。 2.呼叫者負責清理堆疊。 3.引數的資料型別不會導致編譯階段的錯誤。
實現如下:
#include #include void myprintf(const char *format, ...)
case 's':
default:
putchar(ch);
}//switch結束
}//while 結束
va_end(ap);
}//myprintf結束
void main()
vc++中stdarg.h裡x86平台的巨集定義
typedef char * va_list;
#define _intsizeof(n)
( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(va_list ap, format)
( ap = (va_list)& format+ _intsizeof(format) )
#define va_arg(va_list ap,type)
( *(type*)((ap += _intsizeof(type)) -_intsizeof(type)) )
#define va_end(va_list ap)
( ap = (va_list)0 )
printf函式的實現
printf函式是c語言庫函式中的輸出函式。在學習stm32過程用由於需要用到串列埠列印功能,但是程式原來的printf函式列印到串列埠時,出現了大量亂碼。無奈只能自己研究一下printf函式的構成。寫個乙個簡化版的printf函式。int myprintf const char format,wh...
實現自己的printf函式
在嵌入式開發中,常常會通過串列埠列印一些資訊到pc終端,這就需要實現自己的printf函式,下面介紹列印函式print的實現。print.h cpp view plain copy print?ifndef print h define print h void print char fmt,voi...
模擬實現printf函式
如果要想解決這個問題 就要 知道乙個知識點 可變引數列表 可變引數列表是通過巨集來實現的,這些巨集定義於stdarg.h標頭檔案中,它是標準庫的一部分。這個標頭檔案宣告 個型別va list 和三個巨集va start va arg和va end。轉到定義處 檢視一下這幾個巨集和型別 typedef...