你还能用旧的方式在C中做变量参数吗?

时间:2010-03-09 11:33:54

标签: c optional-parameters

纯粹为了兴趣,我在重新学习C之后......我不知道...... 15 - 20年。

我似乎记得变量参数是作为简单的宏实现的。

  • 有谁能记住它们是什么?

编辑:为了澄清我的问题,我知道它们与va_list等名称相同,但你能记住实际的宏定义吗?

  • 他们今天还能继续工作吗?

5 个答案:

答案 0 :(得分:5)

您正在考虑来自stdarg.h(link to WP article)的va_listva_argva_startva_end。他们仍然工作得很好。 : - )

答案 1 :(得分:1)

变量函数确实通常使用宏来实现。这些是标准化的 - 请参阅this wikipedia article主题。实际的宏定义取决于处理器架构,因为它们必须使用调用堆栈来播放非便携式游戏。

答案 2 :(得分:1)

即使在标准化之前,做变量参数的方法也很常见。 C89标准基于现有实践提供了......标准化接口。这些实践的剩余部分仍然存在,例如,<varargs.h>仍存在于Unix98中:http://www.opengroup.org/onlinepubs/007908799/xsh/varargs.h.html(但在当前版本中不再存在)

宏的实现总是非常依赖于系统(堆栈在两个方向上都在增长,甚至有使用链表作为堆栈的系统,堆栈帧中各种东西的位置取决于处理器和常规约定,在一些处理器上 - Sparc说 - 首先需要保存寄存器,对齐要求可能会导致问题,......)

如果你想知道一个简单的实现是什么样的,这里有一个,取决于假设可能是假的(它们不会试图使任何对齐正确),并且即使在假设成立时也肯定会失败一些极端情况:

typedef void* va_list;
#define va_start(va, arg) va = (void*)((&arg)+1)
#define va_arg(va, type)  (va = (void*)(((type*)va) + 1), *((type*)va -1)
#define va_end(va)

答案 3 :(得分:0)

今天的变量参数是通过<stdarg.h>中描述的界面完成的 - 关于15年前他们是如何完成的,我真的不能说。

答案 4 :(得分:0)

很难说如果你的实现它们仍然有效,但是它们几乎与其他人指出的相同,它们只是转移到标准< / strong>标题(标准是有效词)。

编译器扩展的内容取决于编译器,以及调用时传递给它的标志。

请记住,gcc 不是唯一的C编译器,但它(与其他编译器一样)符合c89和c99。