C函数参数列表中```参数的含义是什么?

时间:2012-12-27 03:46:00

标签: c function-parameter

  

可能重复:
  C/C++: Passing variable number of arguments around

根据功能声明方式

return-type function-name(parameter-list, ...) {body ...}

以下代码是否是一种重载?

(在A_FILE.h中)

typedef VOID *FUNCTION(UINTN Number, ...);

似乎我可以将一个Number参数或更多参数传递给FUNCTION函数,参数的数量是否依赖于函数实现?

3 个答案:

答案 0 :(得分:3)

函数声明中的省略号意味着它将接受许多参数,否则是在运行时未知的变量参数,通过使用标准头文件stdarg.h,头文件'stdarg.h'中的各个函数可以确定构成传递给函数的参数的每个变量参数是什么。

考虑以下代码示例:

#define PANIC_BUF_LEN 256
void panic(const char *fmt, ...){
    char buf[PANIC_BUF_LEN];
    va_list argptr;
    va_start(argptr, fmt);
    vsprintf(buf, fmt, argptr);
    va_end(argptr);
    fprintf(stderr, buf);
    exit(errcode);
}

典型的调用可以是一个例子:

panic("Error: %s failed! Due to unknown error, message is '%s'\n", "my_function", "Disk not ready");

将以这种方式在控制台上生成输出:

Error: my_function failed! Due to unknown error, message is 'Disk not ready'

请注意使用va_start(...)va_end(...)以及不提及vsprintf(...)的函数将如何填写“未知”参数提供的空白 va_list初始化为指向 变量参数在运行时未知

编辑:为了强调,调用假定 C字符串格式形式的字符串参数小于{{1}表示的最大大小在上面的示例中,除了挑剔之外,这是为了说明一个函数如何接受所​​使用的许多标准C格式化字符串,例如,可以在其中指定PANIC_BUF_LEN字符串格式,并期望%d匹配参数。

答案 1 :(得分:2)

它不会在C ++意义上过载,但它可以用于类似的效果。 ...表示该函数在命名参数之后接受任意数量的附加参数(必须至少有一个命名参数),而其他参数可以具有任何类型(排序)。 1 这种函数的实现必须能够在运行时推断出其附加参数的数量和类型。例如,printf可以一次打印任何内置类型和任意数量的内容,但您必须在格式字符串中为其提供%代码,这些代码与实际参数相对应。

用于模拟C ++样式重载的变量参数的一个值得注意的例子是open系统调用,在C ++术语中有两个重载:

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

并且manpage以这种方式编写,但是如果你查看<fcntl.h>,你会发现实际的声明是

int open(const char *, int, ...);

如果在标志中设置O_CREAT位,则实现仅查看第三个参数,并且如果设置该位,则必须必须提供第三个参数。像在C中一样,如果你做错了,编译器会在运行时高兴地看着它爆炸。

1 感谢名为“default argument promotion”的残留语言功能,当一些数字类型作为附加参数传递给带有变量数的函数时,会变成其他更大的数字类型论点。如果你正在编写这样一个函数的主体,你只需要担心这个。

答案 2 :(得分:0)

没有。 “...”表示可变参数。

重载是指编译器混合名称以生成具有不同参数集的多个函数。在C中,函数名称没有混杂,但函数可以接受一个或多个参数。