C語言不定引數函式

2021-10-14 04:30:55 字數 1603 閱讀 7500

眾所周知,c語言不支援函式過載,支援函式過載的是c++。究其原因,c語言在編譯函式之後,將"_函式名"存放到函式庫,而c++在編譯函式之後,將"_函式名_引數型別_引數型別"存放到函式庫

但是,在查詢fcntl函式時,卻發現其函式原型有多個

int

fcntl

(int fd,

int cmd)

;int

fcntl

(int fd,

int cmd,

long arg)

;int

fcntl

(int fd,

int cmd,

struct flock *lock)

;

首先,c語言確實不支援函式過載,這種現象被稱為"不定引數函式"

我們都經常接觸不定引數,因為printf就是最常見的不定引數函式,它的函式原型如下:

int

printf

(const

char

*format,..

.);//c99前

intprintf

(const

char

*restrict format,..

.);//c99起

如上所示,"…"表示不定引數,它必須寫在函式列表的最後

c語言引入了三個巨集來處理不定引數的問題,如下所示:

//va_arg()、va_start()、va_end()

#define _intsizeof(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1))

//型別n的大小,這是考慮了位元組對齊

#define va_start(ap,v) ( ap = (va_list)&v + _intsizeof(v) )

//ap指向第乙個不定引數位址

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

#define va_end(ap) ( ap = (va_list)0 )

// 將指標置為無效

type va_arg

(va_list argptr, type)

;void

va_end

(va_list argptr)

;void

va_start

(va_list argptr, last_parm)

;

通過上述巨集的時候,可以將函式傳入堆疊的引數通過指標讀取出來(通過va_start和va_arg傳入的引數型別作為指標的偏移量,即可將堆疊中存放的資料取出)

#include

#include

intsum

(int a,..

.)va_end

(var_ptr)

;return sum;

}int

main()

程式執行結果:

the sum is:

45

C語言不定引數

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

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

函式如何實現不定引數 由於在c語言中沒有函式過載,解決不定數目函式引數問題變得比較麻煩,即使採用c 如果引數個數不能確定,也很難採用函式過載。對這種情況 提出了指標引數來解決問題。1 va list 定義了乙個指標arg ptr,用於指示可選的引數.2 va start arg ptr,argn 使...

C語言基礎 不定引數

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