![](/img/trans.png)
[英]How to count the number of arguments passed to a function that accepts a variable number of arguments?
[英]Is it possible to portably define a function that accepts any number of arguments?
我对“ C可移植性”的含义(IIRC,它意味着C语言跨越多个平台,但必须遵循某些标准(?))有一个模糊的理解,并且想知道我们是否可以移植可编写任何程序来接受参数数量(甚至没有)。
我所知道的是,在不考虑可移植性的情况下,用一对空括号“()”编写的所有函数都可以接受x量的参数,但是呢? 似乎有一些关于可移植定义的函数接受的自变量数量的令人鼓舞的限制的论文,但是我还没有找到说我们不能传递x数量的自变量(其中x是无界的)的论文。
用空括号定义的函数:
无效f(){...}
不接受任何参数,以任何方式调用它都是未定义的行为。
用空括号声明的函数:
无效的g();
必须使用已定义的相同编号和相同类型的参数来调用它,但编译器不会对其进行检查。 如果您搞砸了,这是未定义的行为。
将函数声明为不带任何参数(如果搞砸了,则会收到错误消息),请使用
无效g(void);
一个函数可能是可变参数,但是要调用它,您必须看到一个声明该函数可变参数的声明:
无效h(int nb,...);
(并不是说在C中一个可变参数必须至少具有一个非可变参数,在C ++中不是这样)可变函数必须至少使用指定的非可变参数来调用。
(对于任何功能)参数数量的最小限制为127。(好吧,该标准所说的是,实现必须能够编译至少一个达到该限制的程序)。
-
为了消除混乱:
void f() { ... }
与
void g(void) { ... }
f
被定义为不接受任何参数,并且不能通过声明被接受为未知数量的参数来进行调用,因此编译器将无法确保不给出任何参数。 g
被定义并声明为不接受任何参数。 剩下的K&R日子里,函数定义像
int h()
int i;
{...}
它声明一个带有不确定数量参数的函数,但将其定义为一个int参数。 这种风格完全不合时宜,唯一具有实际重要性的案例就是f vs g。
使用<stdarg.h>
。
参见,例如, C-FAQ的第15节,问题4。
编辑 : stdarg.h>
用法示例
#include <stdarg.h>
#include <stdio.h>
/* sum all values (no overflow checking) up to a 0 (zero) */
int sum(int v, ...) {
va_list va;
int s = v;
if (v) {
va_start(va, v);
while ((v = va_arg(va, int))) {
s += v;
}
va_end(va);
}
return s;
}
int main(void) {
printf("sum(5, 4, 6, 10) is %d\n", sum(5, 4, 6, 10, 0));
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.