函數不定參數實現方式

函數如何實現不定參數:由於在C語言中沒有函數重載,解決不定數目函數參數問題變得比較麻煩,即使採用C++,如果參數個數不能確定,也很難採用函數重載。對這種情況,提出了指針參數來解決問題。

所用函數和結構體

1. va_list

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

2. va_start(arg_ptr, argN)

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

3. va_arg(arg_ptr, type)

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

4. va_end(arg_ptr)

清空參數列表, 並置參數指針arg_ptr無效.(注:va在這裏是variable-argument(可變參數)的意思. 這些宏定義在stdarg.h中,所以用到可變參數的程序應該包含這個頭文件)

示例

例1:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

int print(const char *format, ...)
{
    va_list args;
    const char *args1;
    va_start(args, format);
    args1 = va_arg(args,const char *);
    va_end(args);
    printf("format=%s args1=%s", format, args1);
}
int main()
{
    print("11111", "22222");
}

運行結果:

/*
format=11111 args1=22222
Process returned 24 (0x18)   execution time : 0.542 s
Press any key to continue.
*/

例2:

2#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

int print(const char *format, ...)
{
    va_list args;
    const char *args1;
    va_start(args, format);
    args1 = va_arg(args,const char *);
    va_end(args);
    printf("format=%s args1=%s", format, args1);
}

int main()
{
    print("11111", "22222", "333333");
}

運行結果:

/*
format=11111 args1=22222
Process returned 24 (0x18)   execution time : 0.542 s
Press any key to continue.
*/

我們從上面可以看見這樣在函數中加入三個參數是沒有問題的;

例3:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

int print(const char *format, ...)
{
    va_list args;
    const char *args1;
    va_start(args, format);
    args1 = va_arg(args, const char *);
    args2 = va_arg(args, const char *);
    va_end(args);
    printf("format=%s args1=%s", format, args1, args2);
}


int main()
{

    print("11111", "23333");
}

運行結果:

/*
format=11111 args1=23333
Process returned 24 (0x18)   execution time : 0.153 s
Press any key to continue.

*/

注意是上面並沒有三個參數,但是程序還是可以運行起來的!

從上面三個例子可以看出我們傳入的參數都是一個類型的參數;

例4:

不同類型的函數參數:

int print(const char *format, ...)
{
    va_list args;
    int args1;
    va_start(args, format);
    args1 = va_arg(args, int);
    va_end(args);
    printf("format=%s args1=%d", format, args1);
}


int main()
{

    print("11111", 123);
}

運行結果:

/*
format=11111 args1=123
Process returned 22 (0x16)   execution time : 0.007 s
Press any key to continue.
*/

注意:

va_arg(ap,type)中的type絕對不能爲以下類型:

  • char、signed char、unsigned char
  • short、unsigned short
  • signed short、short int、signed short int、unsigned short int
  • float
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章