簡述C語言變長參數(shù)及stdarg里的相應(yīng)宏實(shí)現(xiàn)畸陡,以
printf()
函數(shù)為例,其參數(shù)個(gè)數(shù)和類型都是不定的罐呼,是如何保證執(zhí)行過程中正常取參的凰萨?
int printf(const char * format, ...)
一、實(shí)現(xiàn)依賴
首先變長參數(shù)的實(shí)現(xiàn)依賴于cdecl調(diào)用慣例械馆,因?yàn)槠湟?guī)定了出棧方為函數(shù)調(diào)用方胖眷,從而解決被調(diào)用函數(shù)無法確定參數(shù)個(gè)數(shù),其次cdecl規(guī)定參數(shù)入棧順序?yàn)閺挠业阶笈椤K缘谝粋€(gè)不定參數(shù)位于棧頂珊搀。
二、stdarg相應(yīng)va_宏
// va_宏&相應(yīng)簡單實(shí)現(xiàn)
#define va_list char *
#define va_start (ap, arg) (ap = (va_list)&arg+sizeof(arg))
#define va_arg (ap, t) (*(t*)( ap+=sizeof(t) - sizeof(t)))
#define va_end (ap = (va_list)0)
- va_list:參數(shù)指針尾菇,指向各個(gè)不定參數(shù)
- va_start:初始化va_list指向第一個(gè)不定參數(shù)
- va_arg:獲取各個(gè)不定參數(shù)值境析,并根據(jù)參數(shù)類型大小將指針指向下一個(gè)不定參數(shù)
- va_end:將va_list 指針清零