前幾天看見小夥伴們發了乙個面試題,題目是printf的可變引數是如何實現的?
然後我就專門研究了一下,通過彙編可以知道他們的實現步驟。
下面我們通過彙編來帶大家了解下他們的輸出結果到底是多少。
printf("int %d, %d\n", 10, a);
彙編如下:
通過彙編可以看出,printf是從右向左進行入棧的,,a和10進行入棧後,最後還會把最前的字串進行入棧。 而在printf函式的實現中有va_arg,va_start等函式,這幾個函式就是用來解析最先入棧的字串,它們會去檢查有多少個%d,%x等之類的符號,通過這個進行確認後面跟了多少引數。
可變引數的型別不是固定的,需由格式字串進行識別(由%f、%d、%s等確定)
在這個函式中,需通過對傳入的格式字串進行識別來獲知可變引數個數及各個可變引數的型別,譬如,在識別為%d後,做的是va_arg ( vap, int ),而獲知為%l和%lf後則進行的是va_arg ( vap, long )、va_arg ( vap, double )。格式字串識別完成後,可變引數也就處理完了。
可變參數列函式的原理及實現
ansi c中庫函式printf的正確形式如下 int printf char fmt,其中,省略號表示參數列的數量和型別是可變的。省略號只能出現在參數列的尾部。如何實現這樣乙個具有可變參數列的函式?在 the c programme language 中實現了這樣乙個示例函式 void minpr...
可變引數及可變引數巨集的使用
我們在c語言程式設計中會遇到一些引數個數可變的函式,例如printf 這個函式,這裡將介紹可變函式的寫法以及原理.一般在除錯列印debug 資訊的時候,需要可變引數的巨集.從c99開始可以使編譯器標準支援可變引數巨集 variadic macros 另外gcc 也支援可變引數巨集,但是兩種在細節上可...
可變引數函式的基本原理及使用實現
本文主要介紹可變引數的函式使用,然後分析它的原理,程式設計師自己如何對它們實現和封裝,最後是可能會出現的問題和避免措施。va函式 variable argument function 引數個數可變函式,又稱可變引數函式。c c 程式設計中,系統提供給程式設計人員的va函式很少。printf scan...