在头文件stdarg.h中定义的函数va_start()有两个参数va_list ap和parmN,这里parmN是函数定义中可变参数列表中最右边的参数的标识符(就在前面的那个,…). 这里我不明白为什么说它不能用寄存器存储类声明
首先,va_start
是一个宏,而不是函数。
本款中描述的
va_start
和va_arg
宏应作为宏实现,而不是函数。
现在,有了这些,C99原理回答了你的问题:
总而言之,标准委员会希望给予C标准库使用对
parmN
参数声明的限制来自于允许这种实现的意图,因为如果参数声明不符合这些限制,则将&
操作符应用于参数名称可能不会产生预期的结果。
&
运算符实现可变参数的自由,如果parmN
具有register
的存储时间,则标准库可能会由于违反第6.5.3.2节第1段而导致未定义行为:
一元
&
操作符的操作数必须是一个函数指示符,即[]
或一元*
操作符的结果,或者是一个左值,该左值指定的对象不是位字段,也不是用register
存储类说明符声明的。