C語言 可變引數列表原始碼的剖析

2021-08-19 21:20:04 字數 1244 閱讀 9821

對可變引數解析之前,我們先看乙個栗子:

實現乙個函式可以求任意個引數的平均值。

宣告乙個va_list型別的變數arg,它用於訪問引數列表的未確定部分。

這個變數是呼叫va_start來初始化的。它的第乙個引數是va_list的變數名,第2個引數是省略號前最後一位有名字的引數。初始化過程把arg變數設定為指向可變引數部分的第乙個引數。

為了訪問引數,需要使用va_arg,這個巨集接受兩個引數:va_list變數和引數列表中下乙個引數的型別。在這個例子中所有的可變引數都是整形。va_arg返回這個引數的值,並使用va_arg指向下乙個可變引數。

最後,當訪問完畢最後乙個可變引數之後,我們需要呼叫va_end.

可變引數的限制:

可變引數必須從頭到尾逐個訪問。如果你在訪問了幾個可變引數之後想半途終止,這是可以的,但是,如果你想一開始就訪問引數列表中間的引數,那是不行的。

引數列表中至少有乙個命名引數。如果連乙個命名引數都沒有,就無法使用va_srart。

這些巨集是無法直接判斷實際存在引數的數量。

這些巨集無法判斷每個引數的型別。

如果在va_arg中指定了錯誤的型別,那麼其後果是不可**的。

如果有興趣我們可以研究一下可變引數實現的細節:

在vs的原始碼中我們可以得知

可變引數的實現過程是使用巨集的封裝。

接下來是可變引數的一些練習:

使用可變引數,實現函式,求函式引數的最大值。

模擬實現printf函式,可完成下面的功能

////能完成下面函式的呼叫。

//print("s ccc d.\n","hello",'b','i','t',100);

//函式原型:

結果如下:

可變引數列表原始碼剖析

c語言中的可變引數列表,顧名思義,在c語言中有一些特殊的函式,它們的引數不是固定的,可以是多種型別的任意多個引數。比如最常用的printf函式和scanf函式,通過使用可變引數列表,使函式可以接收 1個的多種型別的引數。用printf函式的原型來舉例子 int printf const char f...

可變引數列表原始碼的剖析

c語言中的可變引數 1 c語言中的可變引數列表 c語言中有時候會遇到一些引數個數是可變的函式,像scanf,printf等,這些函式內部的引數列表都是可變的。通過將函式實現為可變引數的形式,使得函式可以接受1個以上的任意多個引數。不固定 如函式原型 scanf const char format,解...

可變引數列表原始碼的剖析

在某些情況下我們希望函式引數的個數可以根據實際需要來確定,所以c語言中就提供了一種長度不確定的引數,形如 通過將函式實現為可變引數的形式,可以使得函式可以接受1個以上的任意多個引數。典型的例子有printf scanf 函式等,下面就用printf函式的原型為例分析 int printf const...