stdarg巨集用法 可變引數呼叫

2022-09-29 15:42:17 字數 1098 閱讀 4838

stdarg巨集------可變引數呼叫,定義於stdarg.h標頭檔案,是標準庫的一部分,這個主要在一些核心**中經常看到,這個標頭檔案宣告了型別va_list和三個巨集-----va_start,va_arg,va_end。一般宣告乙個va_list的變數,與這幾個巨集配合使用,訪問引數的值。

var_arg用來訪問引數列表的未確定部分,這個變數通過呼叫va_start來初始化。

va_start函式的第乙個引數是va_list變數的名字,第二個引數是省略號前最後乙個有名字的引數。初始化過程把var_arg變數設定為指向可變引數部分的第乙個引數。

va_arg,這個巨集接受兩個引數:va_list變數和引數列表中下乙個引數型別。va_arg返回這個引數的值,並使var_arg指向下乙個可變引數。

在訪問完最後乙個可變引數之後,需要呼叫va_end。
函式在堆疊中的分布情況是:位址從高到低,依次是函式引數列表,函式返回位址,函式執行**

堆疊中哦,各個函式的分布情況是倒序的

引數在堆疊中的分布情況如下:

最後乙個引數

倒數第二個引數

…第乙個引數

函式返回位址

函式**段

#include#includevoid ******_va_fun(int a,...)

{ va_list arg_ptr;

va_start(arg_ptr,a); //第乙個可選引數位址

for(int i=0;i執行結果如下:

203020

3040

再對比下面的這個**

#include#includevoid ******_va_fun(int b,int a,...)				//區別,多了乙個引數

{ va_list arg_ptr;

va_start(arg_ptr,a); //第乙個可選引數位址

for(int i=0;i再看執行結果:

203020

3040

也就是說va_start的第二個引數只對省略號前最後乙個有名字的引數有效,與前面有名字的引數並無關係。

stdarg巨集用法 可變引數呼叫

stdarg巨集 可變引數呼叫,定義於stdarg.h標頭檔案,是標準庫的一部分,這個主要在一些核心 中經常看到,這個標頭檔案宣告了型別va list和三個巨集 va start,va arg,va end。一般宣告乙個va list的變數,與這幾個巨集配合使用,訪問引數的值。var arg用來訪問...

可變引數巨集

在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadicmacros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如 void printf con...

可變引數巨集

參考各可變引數的部落格,才寫出現在的部落格,有不準確之處,還望指出。1.先看些標準c中printf函式原型 標準c就支援可變引數巨集,也就意味著函式的引數是不固定的,例如printf 函式的原型為 int printf const char format,在gnu c中,巨集也可以接受可變數目的引數...