c語言實現函式可變引數

2021-08-22 08:04:19 字數 1494 閱讀 3988

c語言實現函式可變引數

[%=@title%]

[%=@count%]票 [[%=@percent%]%]

前言:

本文在很大程度上改編自網友kevintz的「c語言中可變引數的用法」一文,在行文之前先向這位前輩表示真誠的敬意和感謝。

一、什麼是可變引數

我們在c語言程式設計中有時會遇到一些引數個數可變的函式,例如printf()函式,其函式原型為:

int printf( const char* format, ...);

它除了有乙個引數format固定以外,後面跟的引數的個數和型別是可變的(用三個點「…」做引數佔位符),實際呼叫時可以有以下的形式:

printf("%d",i);

printf("%s",s);

printf("the number is %d ,string is:%s", i, s);

二、寫乙個簡單的可變引數的c函式

先看例子程式。該函式至少有乙個整數引數,其後是佔位符…,表示後面引數的個數不定. 在這個例子裡,所有的輸入引數必須都是整數,函式的功能是列印所有引數的值.

函式**如下:

//示例**1:可變引數函式的使用

#include "stdio.h"

#include "stdarg.h"

void ******_va_fun(int start, ...)

while(nargvalue != -1);

va_end(arg_ptr);

return;

}

int main(int argc, char* argv)

從這個函式的實現可以看到,我們使用可變引數應該有以下步驟:

⑴在程式中將用到以下這些巨集:

void va_start( va_list arg_ptr, prev_param );

type va_arg( va_list arg_ptr, type );

void va_end( va_list arg_ptr );

va在這裡是variable-argument(可變引數)的意思.

這些巨集定義在stdarg.h中,所以用到可變引數的程式應該包含這個標頭檔案.

⑵函式裡首先定義乙個va_list型的變數,這裡是arg_ptr,這個變數是指向引數位址的指標.因為得到引數的位址之後,再結合引數的型別,才能得到引數的值。

⑶然後用va_start巨集初始化⑵中定義的變數arg_ptr,這個巨集的第二個引數是可變引數列表的前乙個引數,也就是最後乙個固定引數。

⑷然後依次用va_arg巨集使arg_ptr返回可變引數的位址,得到這個位址之後,結合引數的型別,就可以得到引數的值。然後進行輸出。

⑸設定結束條件,這裡的條件就是判斷引數值是否為-1。注意被調的函式在呼叫時是不知道可變引數的正確數目的,程式設計師必須自己在**中指明結束條件。至於為什麼它不會知道引數的數目,讀者在看完下面這幾個巨集的內部實現機制後,自然就會明白。

C語言實現printf函式,即引數可變函式原理

我們在c語言程式設計中會遇到一些引數個數可變的函式,例如printf 這個函式,它的定義是這樣的 int printf const char format,它除了有乙個引數format固定以外,後面跟的引數的個數和型別是 可變的,例如我們可以有以下不同的呼叫方法 printf d i printf ...

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

在 c語言中,有一種引數個數 型別不固定的函式,稱之為變參函式,比如常用的 printf 函式。當我們在輸出 log資訊時 也希望能寫乙個變參函式作為介面。這裡介紹下如何寫變參函式。一 引數巨集 先來看幾個設計變參函式要用到的幾個巨集,這幾個巨集定義在 stdarg.h 檔案中。typedef ch...

C語言函式可變引數

翻apue的時候,看到了一組可變引數的巨集就是va list 類似 void print arg int count,1 va list變數 ifdef m alpha typedef struct va list else typedef char va list 這個 endif 2 intsi...