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

C stdarg.h中定义的函数va_start(va_list ap,parmN),为什么标识符parmN不能用register存储类声明?,c,C,在头文件stdarg.h中定义的函数va_start()有两个参数va_list ap和parmN,这里parmN是命名函数定义中变量参数列表中最右边参数的标识符(就在。在这里,我不明白为什么说它不能用register存储类声明。首先 本子条款中描述的va_start和va_arg宏应作为宏而不是函数来实现 现在,让我们来回答你的问题: 对parmN参数声明的限制源于允许此类实现的意图,因为如果参数的声明不满足这些限制,则将&运算符应用于参数名称可能不会产生预期的结果 总之,标准委员会希望给予C

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

首先

本子条款中描述的
va_start
va_arg
宏应作为宏而不是函数来实现

现在,让我们来回答你的问题:

parmN
参数声明的限制源于允许此类实现的意图,因为如果参数的声明不满足这些限制,则将
&
运算符应用于参数名称可能不会产生预期的结果

总之,标准委员会希望给予C标准库使用
&
运算符实现可变参数的自由,如果
parmN
具有
寄存器
存储持续时间,则标准库可能会因违反以下规定而导致未定义的行为:

一元
&
运算符的操作数应为函数指示符、
[]
或一元
*
运算符的结果,或指定非位字段且未使用
寄存器
存储类说明符声明的对象的左值


这与它很可能还通过寄存器连接到ABI参数这一事实有关。或者@EugeneSh。参数parmN在va_start中是否通过引用传递?如果查看
va_start
的一些实现,您会注意到
&argN
符号。这不仅仅是未定义的行为。这是一个约束冲突,需要编译时诊断。