C語言中函式可變引數解析

2022-05-09 09:36:12 字數 1491 閱讀 6858

大多數時候,函式中形式引數的數目通常是確定的,在呼叫時要依次給出與形式引數對應的所有實際引數。但在某些情況下希望函式的引數個數可以根據需要確定。典型的例子有

大家熟悉的函式printf()、scanf()

可變引數的實現:

c語言標頭檔案stdarg.h提供了乙個資料型別va-list和三個巨集(va-start、va-arg和va-end),va—start使vp指向第乙個可選引數。va—arg返回引數列表中的當前引數並使vp指向引數列表中的下乙個引數。va

—end把vp指標清為null。函式體內可以多次遍歷這些引數,但是都必須以va—start開始,並以va—end結尾。用它們在被呼叫函式不知道引數個數和型別時對可變參數列進行測試,從而為訪問可變引數提供

了方便且有效的方法。va-list是乙個char型別的指標,當被呼叫函式使用乙個可變引數時,它宣告乙個型別為va-list的變數,該變數用來指向va-arg和va-end所需資訊的位置。

下面給出va_list在c中的原始碼:

typedef char * va_list;

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

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

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

呼叫者在實際呼叫引數個數可變的函式時,要通過一定的方法指明實際引數的個數,例如把最後乙個引數置為空字串。

下面給出乙個具體的例子:

求n個數的和:

int sum(int

n,...)

va_end(vp); //va—end把vp指標清為null。

return

sum;

}

printf函式實現:(此處只實現了基本型別的列印)

1

void my_print(const

char *format,...)223

break;24

case'f

':2531

break;32

case'c

':33 putchar(va_arg(vp,char

));34

break;35

case's

':3640

break;41

default:42

break;43

}44}45

break;46

default:47

putchar(c);

48break;49

}50 format++;51}

52  va_end(vp);

53 }

理解可變引數很重要的是要理解函式棧幀的建立與銷毀,裡面涉及到引數是如何壓棧,這方面內容在前面的部落格:

C語言中的可變引數函式

先來個例子,後面再說明 上面的程式我在vc6.0編譯通過 現在說一下可變引數的用法 第一步 函式宣告 functionname char format,第二步 定義va list 變數 ap 第三步 使ap和引數列表關聯起來va start ap,format 第四步 你可以按照引數列表即forma...

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

c語言程式設計中有時會遇到一些引數個數可變的函式,例如printf 函式,其函式原型為 int printf const char format,它除了有乙個引數format固定以外,後面跟的引數的個數和型別是可變的 用三個點 做引數佔位符 實際呼叫時可以有以下的形式 printf d i prin...

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

c語言的可變引數函式的實現需要使用標頭檔案stdarg.h,在該標頭檔案中定義了乙個變數型別va list和三個巨集va start va arg va end 下面將在 中講解這幾個巨集的使用方法。第一種方法是在函式內部手動指定可變引數的型別。首先需要知道可變引數的個數,並作為第乙個引數傳入。由於...