Q我无法获得va_arg拉入一个函数指针类型的参数。
A尝试使用一个typedef来定义函数指针类型。
宏通常进行的类型重写游戏,对于像函数指针这样过于复杂的类型会遇到障碍。为了说明这一点,一个简化版的va_argargpva_arg是
#define va_arg(argp, type) \ (*(type *)(((argp) += sizeof(type)) - sizeof(type)))其中's 类型(va_list)是char *。当你尝试调用宏时,其展开是
va_arg(argp, int (*)()),这是一个语法错误(第一个强制类型转换
(*(int (*)() *)(((argp) += sizeof(int (*)())) - sizeof(int (*)())))(int (*)() *)没有意义)。[脚注]但是,如果你为函数指针类型使用一个
typedeftypedef,那么一切都会顺利。给定
typedef int (*funcptr)();宏的展开是
va_arg(argp, funcptr)是
(*(funcptr *)(((argp) += sizeof(funcptr)) - sizeof(funcptr))),这样就可以正确工作。
参考文献:ISO Sec. 7.8.1.2
Rationale Sec. 4.8.1.2