對可變引數解析之前,我們先看乙個栗子:
實現乙個函式可以求任意個引數的平均值。
宣告乙個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...