回答
據我所知,用C ...
的調用函數參數推到堆棧中從右到左的順序。
調用者負責在調用函數執行後從堆棧中移除參數。這可能正是因爲調用者保證知道它放在堆棧上的參數有多少,而被調用的函數可能會錯誤。
P.S:調用約定通常是實現特定的。我剛剛描述的被稱爲「cdecl」調用約定。將其與通常稱爲「stdcall」的調用約定相比較,其中被調用函數負責從堆棧中移除其參數。因此,它不支持可變長度參數列表。
P.P.S:作爲用戶nategoose評論,我沒有提到的說法如何變量列表實際上使用。見例如POSIX documentation for the <stdarg.h>
header瞭解更多信息。
這很清楚,但你忽略了被調用者的角色。被調用者(如printf)必須使用一個或多個強制參數(如格式字符串)來了解堆棧中的參數應該是什麼。然後它使用目標特定的宏以數組的形式訪問這些宏(系統棧是一個可以移動其頭部的數組)。 stdarg.h頭文件包含您需要執行此操作的宏,並且通常通常將一個指向此數組的頭的指針傳遞給一個函數,該函數將在該函數上工作(如vprintf)。 – nategoose 2010-04-29 18:50:52
@nategoose:謝謝你的寶貴補充。只是爲了讓你知道,我最初故意拋開了這個,因爲OP詢問*編譯器*如何實現可變參數列表,而不是*程序員實際如何使用它們。我已經添加了一個超鏈接到現在的參考文檔。 – stakx 2010-04-29 21:02:14
調查va_start,va_arg和va_end。 Here是這方面的一大堆信息。
至於,你傷心,你有在高科技採訪這個問題,我會認爲正確的答案應該是:
來電將推明確的參數堆棧,變量參數和變量參數的數量本身。然後,目標函數代碼將負責根據傳遞的計數及其堆棧地址彈出所有參數。
並添加一些想法,爲什麼將此參數放在單獨的數組中不方便。
- 1. 編譯器在C++中跳過可變參數模板/函數
- 2. 使用gcc(或MinGW)編譯器有C函數的最大參數數量嗎?
- 3. 如何使用可變數量的參數來替換函數?
- 4. 使用可變參數類型參數的變量函數
- 5. 在編譯器中實現綁定函數參數
- 6. C++可變參數宏編譯錯誤
- 7. C++函數的參數不會編譯
- 8. 在運行時編譯函數C++編譯時編譯的函數的數量
- 9. Haskell:如何使用monadic上下文編寫單變量可變參數函數
- 10. C++ 11:使用向量元素調用可變參數函數
- 11. 如何編寫一個可變數量參數的C#方法?
- 12. 函數參數的編譯器優化
- 13. 如何調用可變數量參數的函數?
- 14. 如何用可變數量的參數定義函數?
- 15. 如何用JavaScript中的可變參數數量覆蓋函數?
- 16. 如何迫使可變參數函數
- 17. 可變數目參數的C函數
- 18. 使用常量正確性實現可變參數壓縮函數
- 19. C++編譯時檢查函數參數
- 20. JVM如何實現可變參數?
- 21. 如何使用對象作爲參數編寫可變參數模板函數?
- 22. 在Javascript中使用可變參數函數調用可變參數函數?
- 23. C函數中的變量參數
- 24. C++中函數參數的變量
- 25. 如何使用參數確定使用JavaScript函數的變量
- 26. 使用可變數量的參數包裝函數
- 27. C++&可變參數與不同的編譯器
- 28. C++將可變數量的參數傳遞給一個函數
- 29. 寫它採用可變數量的參數(C編程)
- 30. C中的可變參數函數
據我所知,可變參數函數是依賴於實現的。 – WhirlWind 2010-04-29 17:43:00