首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以通过可移植的方式定义一个接受任意数量参数的函数?

是否可以通过可移植的方式定义一个接受任意数量参数的函数?
EN

Stack Overflow用户
提问于 2011-03-16 17:01:40
回答 2查看 3K关注 0票数 2

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

我所知道的是,在不考虑可移植性的情况下,所有用空括号'()‘编写的函数都可以接受x个参数,但是用它怎么办?似乎有一些论文鼓励对可移植定义的函数接受的参数数量进行限制,但我还没有找到一篇文章说我们不能传递x个参数(其中x是无界的)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-16 17:12:19

  • a function defined带有一组空的圆括号:

void f() {...}

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

  • a函数声明为,但有一组空的括号:

void g();

必须使用与定义的相同数量和类型的参数进行调用,但编译器不会检查它。如果你搞砸了,这是一种未定义的行为。

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

g(

  • );void

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

void h(int nb,...);

(不是说在C中变量函数必须至少有一个非变量参数,在C++中不是这样)调用变量函数时必须至少指定一个非变量参数。

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

--

要澄清混淆,请执行以下操作:

代码语言:javascript
复制
void f() { ... }

vs

代码语言:javascript
复制
void g(void) { ... }

f被定义为不接受任何参数,并且不能通过声明为接受未知数量的参数来调用,因此编译器将不能确保不给出任何参数。g被定义并声明为不接受参数。它是K&R时代遗留下来的,函数定义如下

代码语言:javascript
复制
int h()
    int i;
{...}

它声明了一个接受不确定数量的参数的函数,但将其定义为接受一个int参数。这种风格完全过时了,剩下的唯一有实际意义的情况是f和g。

票数 4
EN

Stack Overflow用户

发布于 2011-03-16 17:05:43

使用<stdarg.h>

例如,请参阅C-FAQ的第15节问题4。

编辑stdarg.h>用法示例

代码语言:javascript
复制
#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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5322958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档