變引數函式應用

2021-07-29 07:48:12 字數 825 閱讀 8790

在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語言中的實現 在...