printf如何处理其参数?

printf如何处理其参数? 我知道在C#中我可以使用params关键字来做类似的事情,但我无法在C中完成它?

这种函数称为可变函数 。 您可以使用...在C中声明一个,如下所示:

 int f(int, ... ); 

然后,您可以使用va_startva_argva_end来处理参数列表。 这是一个例子:

 #include  #include  #include  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)); } 

有关更多信息,请参阅C Book和stdarg.h 。

在C中完成此操作的方式称为“varargs”。 这里有一个教程: http : //c-faq.com/~scs/cclass/int/sx11b.html

此function在函数中称为可变参数 。 你必须包含stdarg.h头文件; 然后在函数体内使用va_list类型和va_startva_argva_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 

像其他人所说的那样,printf使用va_args来运行。 编写自己的printf版本是一个非常酷的练习,如果没有其他方法来validationprintf,不像Pascal的writeln不是编译魔术。 做完之后,你应该离开它。 这是我写的博客文章,详细说明了原因(简短的回答是你可以创建可能长时间未被发现的错误)。

并且只是为了完成故事gcc(不确定其他编译器)的支持

 #define FUNC(X,Y,...) wiz(X,Y, ##__VA_ARGS__) 

允许可变参数宏