C語言--變長參數


一.  實現原理
  首先變長參數的實現依賴於 cdecl調用,因為其規定了出棧方為函數調用方,從而解決被調用函數無法確定參數個數,其次cdecl規定參數入棧順序為從右到左。所以第一個不定參數位於棧頂
 
二. 宏源碼講解  (va ---> variable-argument(可變參數))
頭文件 stdarg.h

2.1 va_list

#define va_list char *

定義了一個指針arg_ptr, 用於指示可選的參數.

 

2.2 va_start(arg_ptr, argN)

#define va_start (ap, arg) (ap = (va_list)&arg+sizeof(arg))

使參數列表指針arg_ptr指向函數參數列表中的第一個可選參數,argN是位於第一個可選參數之前的固定參數, 或者說最后一個固定參數.如有一va
函數的聲明是void va_test(char a, char b, char c, ...), 則它的固定參數依次是a,b,c, 最后一個固定參數argN為c, 因此就是va_start
(arg_ptr, c).

2.3 va_arg(arg_ptr, type)

#define va_arg (ap, t) (*(t*)( ap+=sizeof(t) - sizeof(t)))

返回參數列表中指針arg_ptr所指的參數, 返回類型為type. 並使指針arg_ptr指向參數列表中下一個參數.返回的是可選參數, 不包括固定參數.

2.4 va_end(arg_ptr)

#define va_end (ap = (va_list)0)

清空參數列表, 並置參數指針arg_ptr無效.

三. 實例

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stdarg.h>
 4 
 5 void test(const char *format, ...)
 6 {
 7     va_list args;
 8     const char *args1;
 9     va_start(args, format);
10     args1 = va_arg(args,const char *);
11     va_end(args);
12     printf("format = %s  args1 = %s",  format,  args1);
13 }
14 int main()
15 {   
16     test( "test1", "test2");
17     return 0;
18 }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM