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. paint函数中的QStyleOptionViewItem参数 - 如何处理它?
- 2. 如何处理参数
- 3. 纹理参数如何处理?
- 4. 如何处理缺失参数的Htaccess
- 5. 嵌套泛型类型参数 - 如何处理它?
- 6. JS如何处理函数参数?
- 7. Java数据源,如何处理它
- 8. printf参数两次
- 9. Struts 2如何处理请求参数
- 10. scala如何处理嵌套参数化?
- 11. 如何处理Google Endpoints方法参数?
- 12. 如何处理href参数jsp
- 13. 如何处理委托参数NSubstitute
- 14. Python win32 com:如何处理'out'参数?
- 15. 如何在RESTful API中处理参数
- 16. 如何在rails中处理参数?
- 17. 如何处理:参数超出范围?
- 18. 如何使execvp()处理多个参数?
- 19. 如何处理动态sql参数
- 20. 如何处理多个事件参数
- 21. 如何处理非法参数验证
- 22. 我如何JSDoc @参数webstorm回调处理程序的参数?
- 23. 如何选择特定的参数来处理使用*参数?
- 24. 使用带参数的printf
- 25. 批处理参数
- 26. zsh处理参数
- 27. R功能;一个调用无关的参数;它是如何处理的?
- 28. golang中的参数处理
- 29. Control.Invoke()和Control.BeginInvoke() - 存储过去的参数在哪里?它如何处理?
- 30. 处理函数和参数
你举的例子是错误的,不工作,因为它违背的C语法。也许你犯了一个错字,忘了下划线? – psihodelia 2010-03-12 18:21:37
另外,提到'#include'会很好。 –
2010-03-12 18:43:09
已修复,感谢您的反馈。 – 2010-03-12 18:48:16