纯粹为了兴趣,我在重新学习C之后......我不知道...... 15 - 20年。
我似乎记得变量参数是作为简单的宏实现的。
编辑:为了澄清我的问题,我知道它们与va_list等名称相同,但你能记住实际的宏定义吗?
答案 0 :(得分:5)
您正在考虑来自stdarg.h(link to WP article)的va_list
,va_arg
,va_start
和va_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。