prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 15.11

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)))
,这样就可以正确工作。

参见问题 1.131.171.21

参考文献:ISO Sec. 7.8.1.2
Rationale Sec. 4.8.1.2


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管