代码之家  ›  专栏  ›  技术社区  ›  philcolbourn

你还能用C语言用老方法处理变量参数吗?

  •  1
  • philcolbourn  · 技术社区  · 16 年前

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

    • 有人记得他们是什么吗?

    • 他们今天还能工作吗?
    5 回复  |  直到 16 年前
        1
  •  1
  •   AProgrammer    16 年前

    即使在标准化之前,做变量论证的方法也很常见。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)
    
        2
  •  5
  •   T.J. Crowder    16 年前

    你在想 va_list va_arg , va_start ,和 va_end link to WP article

        3
  •  1
  •   anon anon    16 年前

    变量函数实际上通常是用宏实现的。这些都是标准化的-参见 this wikipedia article

        4
  •  0
  •   gnud    16 年前

    今天的变量参数是通过中描述的接口完成的 <stdarg.h> -至于15年前是怎么做的,我真的说不清。

        5
  •  0
  •   Tim Post Samir J M Araujo    16 年前

    你的 其实施从远古的时候就还可以了,不过他们跟别人说的差不多,他们只是进入了一个新的阶段 标准 标题(标准为操作词)。

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

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