C語言中實現(xiàn)參數(shù)個數(shù)可變函數(shù)
導(dǎo)語:C語言中實現(xiàn)參數(shù)個數(shù)可變函數(shù):其實,我總覺得有個結(jié)論應(yīng)該是必然的。既然很多語言最初都是由C語言發(fā)展來的,還有很多語言的基礎(chǔ)是用C語言實現(xiàn)的。
那么,這些用C語言實現(xiàn)的高級語言的很多特性或者是功能在一定程度上應(yīng)該是在C語言的開發(fā)中可以模擬的。正是如此,很多時候考慮諸如XXX是否可以用C語言實現(xiàn)的時候,應(yīng)該無需考慮就能夠給出一個肯定的答復(fù)。
關(guān)于參數(shù)可變的'函數(shù)的實現(xiàn)其實還不是這種情況,但是讓我想到的是“是否能夠?qū)崿F(xiàn)參數(shù)個數(shù)可變的C語言功能”時,基本上可以給出一個可以的答案。
在C語言中,參數(shù)個數(shù)可變的函數(shù)功能實現(xiàn)依賴于幾個stdarg.h中定義的宏。在使用的行為上,它們看起來像是函數(shù)。幾個宏清單如下:
va_list:行為有點像數(shù)據(jù)類型
va_start:行為有點像函數(shù),參數(shù)為va_list類型的參數(shù)表以及參數(shù)個數(shù)
va_arg:行為像函數(shù),參數(shù)為va_list參數(shù)表以及參數(shù)數(shù)據(jù)類型
va_end:行為像函數(shù),參數(shù)為va_list的參數(shù)表
示范代碼如下;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include "stdio.h" #include "stdarg.h" float avrg(intarg_num,...); int main( void ) { printf( "avrg value is:%f
" ,avrg( 4 , 1 , 5 , 3 , 6 )); return 0 ; } float avrg(intarg_num,...) { va_list args; int i = 0 ; int sum = 0 ; float avrg_value = 0 .0f; va_start(args,arg_num); for (i = 0 ;i < arg_num;i++) { sum += va_arg(args, int ); } avrg_value = ( float )sum / arg_num; va_end(args); return avrg_value; } 編譯運行以及驗證結(jié)果如下: E:WorkSpace
|