是否可以可移植地定义接受任意数量参数的函数?

时间:2011-03-16 09:01:40

标签: c function arguments portability

我对“C可移植性”的含义有一个模糊的理解(IIRC,它意味着C语言跨越多个平台,但必须遵守某些标准(?))并且想知道我们是否可以移植地编写程序会接受任意数量的论点(甚至没有)。

我所知道的是,如果不考虑可移植性,所有使用空括号'()'编写的函数都可以接受x-amount的参数,但是呢?似乎有一些关于可移植定义函数所接受的参数数量的鼓励限制的论文,但我还没有找到一个说我们不能传递x个参数的文章(x在哪里没有界限)。

2 个答案:

答案 0 :(得分:3)

  • 一个函数已定义,带有一组空括号:

    void f(){...}

不接受任何参数,并且使用any来调用它是未定义的行为。

  • 一个函数声明,带有一组空括号:

    void g();

必须使用与已定义的相同数量和相同类型的参数调用

,但编译器不会检查它。如果你陷入困境,这是一种未定义的行为。

  • 将函数解析为不带参数(如果搞砸了就得到错误信息),请使用

    void g(void);

  • 函数可能是可变参数,但要调用它,你必须看到一个声明函数是可变参数的声明:

    void h(int nb,...);

(不是在C中,可变函数必须至少有一个非可变参数,在C ++中不是这种情况)必须至少调用非可变参数来调用可变参数函数。

参数数量(对于任何函数)的最小限制是127.(嗯,标准说的是实现必须能够编译至少一个达到该限制的程序)。

-

澄清一个混乱:

void f() { ... }

VS

void g(void) { ... }

f被定义为不接受任何参数,并且不能通过声明为接受未知数量的参数来调用,因此编译器不会确保没有给出参数。 g已定义并声明为不接受任何参数。这是K& R天的剩余部分,其功能定义如

int h()
    int i;
{...}

声明一个函数接受一个不确定数量的参数,但将其定义为接受一个int参数。这种风格完全不合时宜,唯一具有实际重要性的案例是f vs g。

答案 1 :(得分:2)

使用<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;
}