函数va_start(va_list ap,parmN)在stdarg.h中定义,为什么标识符parmN不能用寄存器存储类声明?

时间:2015-06-05 19:06:35

标签: c

在头文件stdarg.h中定义的函数va_start()有两个参数va_list ap和parmN这里parmN是命名函数定义中变量参数列表中最右边参数的标识符(在...之前的那个)。 ..)。在这里,我不明白为什么说它不能用寄存器存储类声明。

1 个答案:

答案 0 :(得分:1)

首先,va_start is a macro, not a function

  

本子条款中描述的va_startva_arg宏应实现为宏,而不是函数。

现在,在此之后,C99 rationale回答了您的问题:

  

parmN参数声明的限制遵循允许此类实现的意图,因为将&运算符应用于参数名称可能不会产生预期结果(如果参数的声明)没有达到这些限制。

总之,标准委员会希望为C标准库提供使用&运算符实现可变参数的自由,如果parmN具有register存储持续时间,那么标准由于违反section 6.5.3.2, paragraph 1

,库可能会导致未定义的行为
  

一元&运算符的操作数应该是函数指示符,[]或一元*运算符的结果,或者是指定不是对象的对象的左值位字段,不使用register存储类说明符声明。