c語言可變引數

2021-06-20 00:37:48 字數 1457 閱讀 5467

#ifdef  debug

print_info(x) printk(x,...)

#else

print_info(x)

#endif

一、什麼是可變引數

我們在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函式以及這些可變引數的函式編譯器是如何實現,這個問題卻一直困擾了我好久。本文就這個問題進行一些**,希望能對大家有些幫助.

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

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

函式**如下:

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

#include "stdio.h"

#include "stdarg.h"

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

while(nargvalue != -1);

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 語言可變引數

1 當無法列出傳遞函式的所有實參的型別和數目時,可用省略號指定參數列 void foo void foo parm list,2 函式引數的傳遞原理 函式引數是以資料結構 棧的形式訪問,從右至左入棧.eg include void fun int a,int main output 12 343 獲...

C語言可變引數

在gnu c中,巨集可以接受可變數目的引數,就象函式一樣,例如 1 2 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadic macros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如 1 voidprintf...

c語言 可變引數

c 語言 可變引數 宗旨 技術的學習是有限的,分享的精神是無限的。1 目前為止,見過比較熟悉的可變引數的函式就是 printf 函式 cpp view plain copy print?intprintf const char format,font family arial,helvetica,s...