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



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

首先,va_start是一个,而不是函数

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

现在,有了这些,C99原理回答了你的问题:

parmN参数声明的限制来自于允许这种实现的意图,因为如果参数声明不符合这些限制,则将&操作符应用于参数名称可能不会产生预期的结果。

总而言之,标准委员会希望给予C标准库使用&运算符实现可变参数的自由,如果parmN具有register的存储时间,则标准库可能会由于违反第6.5.3.2节第1段而导致未定义行为:

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

相关内容

最新更新