導語:C語言中實現引數個數可變函式:其實,我總覺得有個結論應該是必然的。既然很多語言最初都是由C語言發展來的,還有很多語言的基礎是用C語言實現的。
那麼,這些用C語言實現的高階語言的很多特性或者是功能在一定程度上應該是在C語言的開發中可以模擬的。正是如此,很多時候考慮諸如XXX是否可以用C語言實現的時候,應該無需考慮就能夠給出一個肯定的答覆。
關於引數可變的函式的實現其實還不是這種情況,但是讓我想到的是“是否能夠實現引數個數可變的C語言功能”時,基本上可以給出一個可以的答案。
在C語言中,引數個數可變的函式功能實現依賴於幾個stdarg.h中定義的巨集。在使用的.行為上,它們看起來像是函式。幾個巨集清單如下:
va_list:行為有點像資料型別
va_start:行為有點像函式,引數為va_list型別的引數表以及引數個數
va_arg:行為像函式,引數為va_list引數表以及引數資料型別
va_end:行為像函式,引數為va_list的引數表
示範程式碼如下;
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | #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; } 編譯執行以及驗證結果如下: E:WorkSpace |