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
#include
void
******_va_fun
(int a,..
.)va_end
(arg_ptr)
;//將指標置為無效
return;}
intmain()
執行結果如下:
20
3020
3040
再對比下面的這個**
#include
#include
void
******_va_fun
(int b,
int a,..
.)//區別,多了乙個引數
va_end
(arg_ptr)
;//將指標置為無效
return;}
intmain()
再看執行結果:
20
3020
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中,巨集也可以接受可變數目的引數...