C语言 如何解释这个#define va_ arg(list,mode)((mode *)(list += sizeof(mode))[-1]

3df52oht  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(132)
#define va_arg(list,mode) ( (mode *) ( list += sizeof(mode) ) [-1]

不知道[-1]怎么看?指针能不能指向这个位置?
我认为这指向mode中的前一个值

b09cbbtk

b09cbbtk1#

#define va_arg(list,mode) ( (mode *) ( list += sizeof(mode) ) [-1]
这是va_arg宏的一个实现,将由<stdarg.h>为C 2018 7.16中的C变量参数特性定义。
当使用这个宏时,list应该是va_list对象,而mode应该是型别。在这个C实作中,va_list显然是实作为字符型别的指标,或是在扩充指标算术以使用void *的C实作中,实作为void的指标。
然后list += sizeof(mode)list向前推进mode类型对象中的字节数,以考虑即将被宏“消耗”的参数。然后( list += sizeof(mode) )之前的(mode *)转换将指针转换为指向所需类型。但是,由于+=,它现在指向所需参数之后。而这个指针值是+=表达式和强制转换的结果。因此,它后面的[-1]用于提取list指向的位置之前的元素。
我怀疑使用[-1]的这种略微笨拙的构造是为了避免在宏中两次使用list,这是避免多次计算副作用的好做法,以防宏参数是一个具有副作用的表达式。
请注意,在list += sizeof(mode)中使用list可能是一个错误或疏忽;它应该是(list) += sizeof(mode)

相关问题