3 回答

TA貢獻(xiàn)2021條經(jīng)驗 獲得超8個贊
但是,為什么默認(rèn)情況下不將其設(shè)置為開頭?
也許是由于歷史原因?qū)е碌?,?dāng)時編譯器還不夠聰明??赡苁且驗槟赡軗碛幸粋€varargs函數(shù)原型,而該原型實際上并不在乎varargs,而在該特定系統(tǒng)上設(shè)置varargs恰好很昂貴??赡苁且驗関a_copy您要執(zhí)行更復(fù)雜的操作,或者您想多次重新啟動參數(shù)并多次調(diào)用va_start。
簡短的版本是:因為語言標(biāo)準(zhǔn)是這樣說的。
第二,對我來說不清楚,為什么我們需要計數(shù)。C ++不能自動確定參數(shù)的數(shù)量嗎?
那不是全部count。它是函數(shù)的最后一個命名參數(shù)。va_start需要它來找出可變參數(shù)在哪里。這很可能是由于舊編譯器的歷史原因所致。我不明白為什么今天不能以不同的方式實現(xiàn)它。
問題的第二部分:不,編譯器不知道向該函數(shù)發(fā)送了多少個參數(shù)。它甚至可能不在同一編譯單元或同一程序中,并且編譯器也不知道該函數(shù)將如何被調(diào)用。想象一個具有varargs函數(shù)的庫,例如printf。當(dāng)您編譯libc時,編譯器不知道何時以及如何調(diào)用程序printf。在大多數(shù)ABI上(ABI是如何調(diào)用函數(shù),如何傳遞參數(shù)的約定,等等),無法找出函數(shù)調(diào)用獲得了多少個參數(shù)。將這些信息包含在函數(shù)調(diào)用中非常浪費,而且?guī)缀醪恍枰R虼?,您需要一種方法來告訴varargs函數(shù)有多少個參數(shù)。存取中va_arg 未定義的行為超出了實際傳遞的參數(shù)數(shù)量。
然后我不清楚我們?yōu)槭裁匆褂胿a_end(ap)。它會發(fā)生什么變化?
在大多數(shù)架構(gòu)va_end上,沒有任何相關(guān)的事情。但是有些架構(gòu)具有傳遞自變量語義的復(fù)雜參數(shù),va_start甚至可能潛在地va_end分配內(nèi)存,那么您就需要釋放該內(nèi)存。
這里的簡短版本也是:因為語言標(biāo)準(zhǔn)是這樣說的。

TA貢獻(xiàn)1934條經(jīng)驗 獲得超2個贊
va_start初始化變量參數(shù)列表。您總是將最后一個命名函數(shù)參數(shù)作為第二個參數(shù)傳遞。這是因為您需要提供有關(guān)堆棧中變量自變量開始的位置的信息,因為自變量被壓入堆棧,并且編譯器無法知道變量自變量列表的開始位置(沒有區(qū)別)。
至于va_end,它用于釋放在va_start調(diào)用期間分配給變量參數(shù)列表的資源。
- 3 回答
- 0 關(guān)注
- 602 瀏覽
添加回答
舉報