我对“C可移植性”的含义有一个模糊的理解(IIRC,它意味着C语言跨越多个平台,但必须遵守某些标准(?))并且想知道我们是否可以移植地编写可以接受任何数量的参数(甚至没有参数)的程序。
我所知道的是,在不考虑可移植性的情况下,所有用空括号'()‘编写的函数都可以接受x个参数,但是用它怎么办?似乎有一些论文鼓励对可移植定义的函数接受的参数数量进行限制,但我还没有找到一篇文章说我们不能传递x个参数(其中x是无界的)。
发布于 2011-03-16 17:12:19
void f() {...}
不接受任何参数,并且使用任何参数调用它是未定义的行为。
void g();
必须使用与定义的相同数量和类型的参数进行调用,但编译器不会检查它。如果你搞砸了,这是一种未定义的行为。
g(
void h(int nb,...);
(不是说在C中变量函数必须至少有一个非变量参数,在C++中不是这样)调用变量函数时必须至少指定一个非变量参数。
参数数量的最小限制(对于任何函数)是127。(标准所说的是,一个实现必须能够编译至少一个达到该限制的程序)。
--
要澄清混淆,请执行以下操作:
void f() { ... }vs
void g(void) { ... }f被定义为不接受任何参数,并且不能通过声明为接受未知数量的参数来调用,因此编译器将不能确保不给出任何参数。g被定义并声明为不接受参数。它是K&R时代遗留下来的,函数定义如下
int h()
int i;
{...}它声明了一个接受不确定数量的参数的函数,但将其定义为接受一个int参数。这种风格完全过时了,剩下的唯一有实际意义的情况是f和g。
发布于 2011-03-16 17:05:43
使用<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;
}https://stackoverflow.com/questions/5322958
复制相似问题