C語言中實現引數個數可變的函式

2021-04-25 00:09:56 字數 1132 閱讀 2513

以前一直不知道原來c語言也有引數個數可變的函式。

1、採用ansi標準形式時,引數個數可變的函式的原型宣告是:

type   funcname(type   para1,   type   para2,   ...)

----   這種形式至少需要乙個普通的形式引數,後面的省略號不表示省略,而是函式原型的一部分。type是函式返回值和形式引數的型別。

2、 採用與unix   system   v相容的宣告方式時,引數個數可變的函式原型是:

type   funcname(va_alist)  

va_dcl

----   這種形式不需要提供任何普通的形式引數。type是函式返回值的型別。va_dcl是對函式原型宣告中引數va_alist的詳細宣告,實際是乙個巨集定義,對不同的硬體平台採用不同的型別來定義,但在最後都包括了乙個分號。因此va_dcl後不再需要加上分號了。va_dcl在**中必須原樣給出。va_alist在vc中可以原樣給出,也可以略去,但在unix上的cc或gcc中都要省略掉。

----   此外,採用標頭檔案stdarg.h編寫的程式是符合ansi標準的,可以在各種作業系統和硬體上執行;而採用標頭檔案varargs.h的方式僅僅是為了與以前的程式相容。所以建議大家使用前者。以下主要就前一種方式對引數的處理做出說明。兩種方式的基本原理是一致的,只是在語法形式上有一些細微的區別。     

----   va_start使argp指向第乙個可選引數。va_arg返回引數列表中的當前引數並使argp指向引數列表中的下乙個引數。va_end把argp指標清為null。函式體內可以多次遍歷這些引數,但是都必須以va_start開始,並以va_end結尾。     

----   呼叫者在實際呼叫引數個數可變的函式時,要通過一定的方法指明實際引數的個數,例如把最後乙個引數置為空字串(系統呼叫execl()就是這樣的)、-1或其他的方式(函式printf()就是通過第乙個引數,即輸出格式的定義來確定實際引數的個數的)。    

程式演示:   

1、演示如何使用引數個數可變的函式,採用ansi標準形式

2、演示如何使用引數個數可變的函式,採用與unix system v相容的方式

C語言中不定引數個數的函式

c 中有函式過載這種方法,以供我們呼叫時要可以不確定實參的個數,其實c語言也可以,而且更高明!我們在stdio.h中可以看到printf 函式的原型 int printf char format,事實上,我們如果要寫這樣的函式也可以類似的寫,那麼在定義函式時用上這個符號 它叫佔位符,喊它 三個點 也...

引數個數可變的函式

今天突然想起引數個數可變的函式,然後想了下,覺得自己還真不太了解它,遂決定弄清楚。1.如何取得可變引數 比如 void f int fixpara1,char p char fixpara1 取得固定引數位址 cout int p 為什麼p 4可以取到第乙個可變引數呢?因為引數在函式被呼叫前,會逐個...

可變引數個數的函式

type vafunction type arg1,type arg2,引數可以分為兩部分 個數確定的固定引數和個數可變的可選引數。函式至少需要乙個固定引數,固定引數的宣告和普通函式一樣 可選引數由於個數不確定,宣告時用 表示。固定引數和可選引數公同構成乙個函式的引數列表。標準c c 包含標頭檔案s...