簡體   English   中英

如何在變量參數函數中在堆棧上傳遞參數?

[英]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);        

鏈接到varargs函數中的多少個參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM