#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...