C打印函数printf的一种实现原理简要分析
生活随笔
收集整理的這篇文章主要介紹了
C打印函数printf的一种实现原理简要分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】README
- 0.1)本文旨在對 printf 的 某一種 實現 原理進行分析,做了解之用;
- 0.2) vsprintf 和 printf.c 的源碼,參見
https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/p309
【1】printf函數代碼分析:
https://github.com/pacosonTang/dataStructure-algorithmAnalysis/blob/master/p309/printf.c
- P1)line66: va_list arg = (va_list)((char*)(&fmt) + 4); 要知道,對于C函數的調用,壓棧順序是從右參數往左邊參數壓棧,最右邊參數最先壓棧,最左邊參數最后壓棧;當然, (&fmt+4)指向的是 printf參數列表中 “…” 的首地址, 而“…” 代表的是參數列表(低地址到高地址,因為壓棧順序就是從高地址到低地址壓棧):MAG_CH_ASSERT, exp, file, base_file, line ;
- P2)結合以上敘述,我們得到 buf 就是個字符串數組(可以看做緩沖區)、 fmt = “%c assert(%s) failed: file: %s, base_file: %s, ln%d” 、arg = MAG_CH_ASSERT, exp, file, base_file, line 五個參數列表(即長度為5的20字節數組,每個地址4個字節);
【2】vsprintf 函數代碼分析:
https://github.com/pacosonTang/dataStructure-algorithmAnalysis/blob/master/p309/vsprintf.c
V1)line68: 調用 vsprintf 函數,同樣的,參數壓棧順序是從右往左壓棧, 我們看看vsprintf 的源碼, 結合源碼,我們的分析如下:
- V1.1)line57~60 :非找到 fmt 中的 % 不可(%是定義輸出格式的標識符), 且fmt 的字符是一個一個copy 到buf 的;
- V1.2)line87~113:從參數列表 p_next_arg = args 中 抽取出 格式字符串,用q = inner_buf 來存儲這些參數值;(顯然,i2a()函數是 數字輸出的不同進制的轉換,16進制、10進制等),p_next_arg += 4; p_next_arg 為什么自加4 ,不用我多說了吧;
- V1.3)line119~122:用inner_buf 存儲的格式輸出值 去填充 %定義的格式輸出;
V2)再看看 vsprintf 對于 輸出格式寬度是如何處理的?如%10d,等等;
- V2.1)line62 :將align_nr 初始化為 0;
- V2.2)line67~77: 是在 對 %下一個字符出現的可能情況的處理: 如果有兩個 %% 并排,則表明輸出為%、如果為0,待會cs=0、如果是其他情況,cs=空格;
- V2.3)line78~82: 是在對 % 下一個字符是數字(打印寬度)的處理;
- V2.4)line115~118:將cs 的值賦給 緩沖區 buf, 這里應該是把空格賦值過去,以填充打印寬度(說實話,這里我也沒有好懂, 不過printf 的 實現步驟的大致方向清楚了);
總結
以上是生活随笔為你收集整理的C打印函数printf的一种实现原理简要分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高通骁龙8cxgen3跑分详细介绍
- 下一篇: 进程间通信(IPC)+进程加锁解锁