printf如何处理其参数?

Han*_*sir 16 c printf arguments

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

Jus*_*ier 18

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

int f(int, ... );
Run Code Online (Sandbox Code Playgroud)

然后va_start,您可以使用,va_argva_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));
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅C Bookstdarg.h.

  • 您的示例是错误的,并且不起作用,因为它与C语法相矛盾.也许你写了一个错字并忘记了下划线? (2认同)

psi*_*lia 9

此功能在函数中称为可变参数.你必须包含stdarg.h头文件; 然后在函数体内使用va_list类型和va_start,va_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);
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用你的函数:

print_arguments(3,1,2,3);
Run Code Online (Sandbox Code Playgroud)

将打印出以下内容:

    I am first element of the list: 1
    I am second element of the list: 2
    I am third element of the list: 3
Run Code Online (Sandbox Code Playgroud)

  • 你的意思是'print_arguments(3,1,2,3)`? (2认同)

Tyl*_*nry 8

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


pli*_*nth 7

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


pm1*_*100 5

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

#define FUNC(X,Y,...) wiz(X,Y, ##__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

允许可变参数宏