C語言函式不定引數實現方式

2021-09-24 19:59:26 字數 2443 閱讀 2627

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

(1)va_list

定義了乙個指標arg_ptr, 用於指示可選的引數.

(2)va_start(arg_ptr, argn)使引數列表指標arg_ptr指向函式引數列表中的第乙個可選引數,argn是位於第乙個可選引數之前的固定引數, 或者說最後乙個固定引數.如有一va 函式的宣告是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:

1 #include 2 #include 3 #include 4 

5 int print(const char *format, ...)

6 14 int main()

15

執行結果:

1 /*

2 format=11111 args1=22222

3 process returned 24 (0x18) execution time : 0.542 s

4 press any key to continue.

5 */

例2:

1 例2:

2 #include 3 #include 4 #include 5

6 int print(const char *format, ...)

7 15

16 int main()

17

執行結果:

1 /*

2 format=11111 args1=22222

3 process returned 24 (0x18) execution time : 0.542 s

4 press any key to continue.

5 */

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

例3:

1 #include 2 #include 3 #include 4 

5 int print(const char *format, ...)

6 15

16 17 int main()

18

執行結果:

1 /*

2 format=11111 args1=23333

3 process returned 24 (0x18) execution time : 0.153 s

4 press any key to continue.

5 6 */

注意是上面並沒有三個引數,但是程式還是可以執行起來的!

從上面三個例子可以看出我們傳入的引數都是乙個型別的引數;

例4:不同型別的函式引數:

1 int print(const char *format, ...)

2 10

11 12 int main()

13

執行結果:

1 /*

2 format=11111 args1=123

3 process returned 22 (0x16) execution time : 0.007 s

4 press any key to continue.

5 */

但是注意不能使用:總之,va_arg(ap,type)中的type絕對不能為以下型別:——char、signed char、unsigned char——short、unsigned short——signed short、short int、signed short int、unsigned short int——float

C語言不定引數函式

眾所周知,c語言不支援函式過載,支援函式過載的是c 究其原因,c語言在編譯函式之後,將 函式名 存放到函式庫,而c 在編譯函式之後,將 函式名 引數型別 引數型別 存放到函式庫 但是,在查詢fcntl函式時,卻發現其函式原型有多個 int fcntl int fd,int cmd int fcntl...

C語言不定引數

最近,遇到乙個c語言的不定引數問題。其實,對於c語言的不定引數問題,只需要三個函式就可以搞定了。這三個函式的標頭檔案是,其實下面的三個函式都是乙個巨集定義 macro 這三個函式是 void va start va list ap,last type va arg va list ap,type v...

C語言基礎 不定引數

在這一節裡我們來學習c語言中另外乙個重要的機制,不定引數。不定引數是指函式可以接收不確定個數的引數,不定引數用.來表示,它必須要寫在正常參數列的後面,例如我們熟知的printf函式 int printf char fmt,printf的第乙個引數為char fmt,後面則是不定引數。它表示可以接收任...