關於printf函式及變引數函式實現

2021-06-02 16:47:03 字數 896 閱讀 6042

printf函式一直都是乙個很強大的函式,它的變引數是怎麼實現的?一直是乙個困擾我的問題。經過查詢資料,了解了這是一類c語言通用的問題:變引數函式的實現。

要實現這種機制,必須要現了解4個巨集定義:va_list, va_start,

va_arg, va_end。下面給出這四個巨集定義在c語言中的實現:

在解釋這幾個巨集定義之前先要了解一下可邊引數函式的實現原理。我們知道根據—cdecl函式呼叫方法,函式的引數都儲存在棧裡,並且是從右到左依次進棧,這塊引數的記憶體是連續的。因此只要我們知道了第乙個引數的記憶體位址,並且知道每個引數的大小,就可以依次處理每個引數。在這之前有一點需要明確,ansic規定:可變引數前沒有固定引數的函式是非法的。

va_list:很明顯這是乙個指標型別,指向字串的指標,是乙個簡單的巨集替換。

va_start(va_list ap,format):為獲取可變數目引數的函式提供一中便捷手段,設定ap為指向傳給函式引數列表中第乙個可選引數的指標,且該引數為va_list型別。format是引數列表中第乙個可選引數前的必選引數。

va_arg(va_list ap,type):返回由ap所指向的引數的值,且自增指向下乙個引數的位址。type為當前引數的型別,用來計算該引數的長度,確定下乙個引數的起始位置。它可以在函式中呼叫多次,直到得到函式的所有引數為止。但必須在巨集va_start後面呼叫。

va_end(va_list ap):在獲取所有引數後,設定指標ap為null

下面是乙個簡單的變參函式的實現:

#include #include #include int sum(int data,...)

va_end(v1);

return s;

}int main(int argc, char *argv)

變引數函式

標準庫提供的一些引數的數目可以有變化的函式。例如我們很熟悉的printf,它需要有乙個格式串,還應根據需要為它提供任意多個 其他引數 這種函式被稱作 具有變長度參數列的函式 或簡稱為 變引數函式 我們寫程式中有時也可能需要定義這種函式。要定義這類函式,就必須使用標準標頭檔案,使用該檔案提供的一套機制...

python的引數函式 關於python 函式引數

函式引數 必選引數 預設引數 可選引數 關鍵字引數 1.預設引數 預設引數可以簡化函式的呼叫。設定預設引數時,有幾點要注意 一是必選引數在前,預設引數在後,否則python的直譯器會報錯 二是如何設定預設引數。當函式有多個引數時,把變化大的引數放前面,變化小的引數放後面。變化小的引數就可以作為預設引...

變引數函式應用

在c語言中常用到的printf函式就是變引數函式。函式定義如下void printf const char fmt,後面的.就是可變引數。應用變引數函式需要用到 c中變長實參標頭檔案stdarg.h提供了乙個資料型別va list和三個巨集 va start,va arg,va end typede...