不定參數在C語言中的應用執行個體

來源:互聯網
上載者:User

不定參數在C語言中的應用執行個體:不定參數當年做為C/C++語言一個特長被很多人推崇,但是實際上這種技術並沒有應用很多。除了格式化輸出之外,我實在沒看到多少應用。主要原因是這種技術比較麻煩,副作用也比較多,而一般情況下重載函數也足以替換它。儘管如此,既然大家對它比較感興趣,我就簡單總結一下它的使用和需要注意的常見問題。

剛學C語言的時候,一般人都會首先接觸printf函數。通過這個函數,你可以列印不定個數的變數到螢幕,如:

printf("%d", 3);

printf("%d,%d",3,4);

上述代碼看似簡單,實際上卻需要我們解決許多問題。在我們設計printf的時候,我們是不知道到底會傳入幾個參數的。在這種未知的情況下,我們需要解決下面幾個問題:

怎麼告訴printf我們會傳入幾個參數

printf怎麼去訪問這些參數

函數調用完成後,系統怎麼把參數從傳遞用的堆棧中釋放

為瞭解決這些問題,我們首先要解釋cdecl呼叫慣例,所有使用不定參數的函數必須是使用cdecl(全域函數)或者this call(類成員函數)呼叫慣例。該約定對於參數傳遞規定如下:

參數從右向左入棧(也就是如果你調用f(a,b,c),則c先入棧,然後是b,最後是a入棧)

調用者負責清理堆棧

其中第二點直接解決了前面三個問題中的第三個問題。我們來詳細說說其他兩個問題。

確定參數的個數

在一個函數中,一般有如下prelog代碼:

00401020   push        ebp

00401021   mov         ebp,esp

00401023   sub         esp,48h

執行上述代碼之後,func(a,b,c)函數所處的堆棧上下文就變成如下布局:

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。