在c語言中常用到的printf函式就是變引數函式。
函式定義如下void printf(const char* fmt, ...) 後面的...就是可變引數。
應用變引數函式需要用到
c中變長實參標頭檔案stdarg.h提供了乙個資料型別va_list和三個巨集:va_start,va_arg,va_end
→ typedef char * va_list; 用來指向上述三個巨集所需資料的位置
→#define va_start(ap,v) ( ap = (va_list)&v + _intsizeof(v) )
用來使ap指向函式可變參數列中的第乙個引數;v是函式引數中最後乙個固定引數的標示符。
其中#define_intsizeof(n) ( (sizeof(n) +sizeof(int) - 1) & ~(sizeof(int) - 1) )
→ #define va_arg(ap,type) ( *(type *)((ap += _intsizeof(type)) -_intsizeof(type)) )
用來將引數轉換成需要的型別,並使ap指向下乙個引數
→ #defineva_end(ap) ( ap = (va_list)0 )
該巨集用於被呼叫函式完成正常返回,功能就是把指標ap賦值為0,使它不指向記憶體的變數
使用方法舉例; 連乘函式
#include int multiply(int n, ...)
變引數函式
標準庫提供的一些引數的數目可以有變化的函式。例如我們很熟悉的printf,它需要有乙個格式串,還應根據需要為它提供任意多個 其他引數 這種函式被稱作 具有變長度參數列的函式 或簡稱為 變引數函式 我們寫程式中有時也可能需要定義這種函式。要定義這類函式,就必須使用標準標頭檔案,使用該檔案提供的一套機制...
C語言變引數函式
include includeusing namespace std int sum int cnt,va end args return ans int main 1.printf 和scanf 就是變引數函式,變引數函式的第乙個引數不可省略,並且這第乙個引數型別必須確定.如上,sum函式的第乙個...
關於printf函式及變引數函式實現
printf函式一直都是乙個很強大的函式,它的變引數是怎麼實現的?一直是乙個困擾我的問題。經過查詢資料,了解了這是一類c語言通用的問題 變引數函式的實現。要實現這種機制,必須要現了解4個巨集定義 va list,va start,va arg,va end。下面給出這四個巨集定義在c語言中的實現 在...