printf如何處理它的參數?我知道在C#中,我可以使用params
關鍵字來做類似的事情,但我無法在C中完成它?printf如何處理它的參數?
回答
這樣的功能被稱爲variadic function。您可以使用...
用C申報一個,像這樣:
int f(int, ...);
然後你可以使用va_start
,va_arg
,並且va_end
有參數列表工作。這裏有一個例子:
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
void f(void);
main(){
f();
}
int maxof(int n_args, ...){
register int i;
int max, a;
va_list ap;
va_start(ap, n_args);
max = va_arg(ap, int);
for(i = 2; i <= n_args; i++) {
if((a = va_arg(ap, int)) > max)
max = a;
}
va_end(ap);
return max;
}
void f(void) {
int i = 5;
int j[256];
j[42] = 24;
printf("%d\n",maxof(3, i, j[42], 0));
}
欲瞭解更多信息,請參閱The C Book和stdarg.h。
這在C中完成的方式稱爲「可變參數」。這裏有一個教程:http://c-faq.com/~scs/cclass/int/sx11b.html
此功能被稱爲函數中的變量數量爲。您必須包含stdarg.h頭文件;然後用的va_list類型和的va_start,在va_arg,並va_end用來功能的函數體中:
void print_arguments(int number_of_arguments, ...)
{
va_list list;
va_start(list, number_of_arguments);
printf("I am first element of the list: %d \n", va_arg(list, int));
printf("I am second element of the list: %d \n", va_arg(list, int));
printf("I am third element of the list: %d \n", va_arg(list, int));
va_end(list);
}
然後調用你的函數是這樣的:
print_arguments(3,1,2,3);
這將打印出以下內容:
I am first element of the list: 1
I am second element of the list: 2
I am third element of the list: 3
你是不是指'print_arguments(3,1,2,3)'? – bk1e 2010-03-12 15:30:12
@ bk1e:謝謝,我犯了一個錯誤;已更新 – psihodelia 2010-03-12 18:18:51
和其他人一樣,printf使用va_args來運行。編寫自己的printf版本是非常酷的練習,如果沒有別的辦法來驗證printf,不像Pascal的寫法不是編譯器魔術。你這樣做後,你應該走開。這裏有一個blog article我寫了詳細說明爲什麼(簡單的答案是你可以創建可能長時間未被發現的錯誤)。
,只是完成了故事的gcc(不知道其他的編譯器)支持
#define FUNC(X,Y,...) wiz(X,Y, ##__VA_ARGS__)
,讓複雜的宏
- 1. 如何printf處理轉換
- 2. paint函數中的QStyleOptionViewItem參數 - 如何處理它?
- 3. 如何處理參數
- 4. 如何處理參數c#
- 5. Printf的參數
- 6. 紋理參數如何處理?
- 7. Django的網址:如何處理參數
- 8. 如何處理程序中的參數?
- 9. 如何處理缺失參數的Htaccess
- 10. 如何處理重複的參數?
- 11. 如何處理可選的GET參數?
- 12. QString arg中不超過9個參數?如何處理它?
- 13. 嵌套泛型類型參數 - 如何處理它?
- 14. Javascript如何處理函數參數
- 15. JS如何處理函數參數?
- 16. Java數據源,如何處理它
- 17. printf參數兩次
- 18. Printf功能參數
- 19. 重複printf參數
- 20. 如何處理動態sql參數
- 21. 如何處理委託參數NSubstitute
- 22. 如何使execvp()處理多個參數?
- 23. 如何在Express中處理GET參數?
- 24. Python win32 com:如何處理'out'參數?
- 25. Python argparse:如何處理MacOSX' -psn`參數
- 26. 如何處理:參數超出範圍?
- 27. scala如何處理嵌套參數化?
- 28. Struts 2如何處理請求參數
- 29. 如何處理多個事件參數
- 30. 如何處理href參數jsp
你舉的例子是錯誤的,不工作,因爲它違背的C語法。也許你犯了一個錯字,忘了下劃線? – psihodelia 2010-03-12 18:21:37
另外,提到'#include'會很好。 –
2010-03-12 18:43:09
已修復,感謝您的反饋。 – 2010-03-12 18:48:16