2010-08-13 33 views
2

對我來說,像printf()這樣的函數並沒有限制參數的數量。如何在不限制參數數量的函數中傳遞參數?

但是,當在Solaris上調試程序時,我注意到它會將最多5個參數壓入堆棧,如果有超過5個參數,將使用通用寄存器。

那麼即使普通的寄存器在printf這樣的函數中也不夠用,會發生什麼呢?編譯器爲我做了些什麼?

回答

4

行爲由平臺的ABI控制。如果參數比參數寄存器更多,那麼它們將以不同的方式處理。對於可以傳遞的參數數量沒有簡單的上限,所以編譯器和ABI定義了一種適用於所討論的硬件的機制。例如,Intel IA32不一定適用於SPARC。

0

通常情況下,ABI使用寄存器傳遞參數的平臺切換到不同的可變參數調用約定,從而一切都在棧上傳遞。這就是爲什麼C標準將未定義行爲分配給沒有原型的調用可變參數函數的原因;如果沒有原型,編譯器會在這樣的平臺上產生不正確的調用。

應該指出的是,一些平臺使用更復雜的(無用的複雜的,我會說)將參數傳遞給可變參數函數的方法,比如構造一種鏈接列表並將隱藏指針傳遞給該列表, va_start然後以某種方式能夠獲得。作爲程序員,你應該把整個stdarg.h作爲一個黑盒子來處理,並且祈禱你永遠不必看到一些醜陋的實現的細節...