[英]How are parameters passed on the stack in variable argument function?
我以為函數完成后會從堆棧中刪除參數,但是像printf這樣的函數在調用時會從堆棧中刪除可變數量的參數。
它如何知道要從堆棧中刪除多少個參數? 是否有一個秘密參數指定要傳遞多少個參數?
謝謝
C調用約定指定是調用者,而不是被調用 者 ,這是從堆棧中彈出參數的原因。 這就是帶有可變參數列表的函數必須為cdecl
。 所以,
我認為該函數完成后會從堆棧中刪除參數。
這僅適用於某些調用約定,不適用於C調用約定 。
它如何知道要從堆棧中刪除多少個參數? 是否有一個秘密參數指定要傳遞多少個參數?
否,沒有,沒有秘密的論點。
調用者函數將清理堆棧(按照正確的調用約定)。 編譯器將為此生成代碼。 編譯器是一個確切知道您在參數列表上傳遞了多少個參數的編譯器,因為它編譯了它。
調用代碼將清理堆棧,並由被調用函數正確確定是否有“足夠”的參數已傳遞給它想要執行的操作。 這不必一定是這樣的參數,它可以是這樣的:
int sum(int first, ...)
{
int s = first;
int v;
va_list va;
va_start(va, first);
while (v = va_arg(va, int) != -1)
{
sum += v;
}
va_end(va);
return sum;
}
x = sum(1, 2, 3, -1);
y = sum(1, 2, 3, 4, 5, 6, 7, 8, 9, -1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.