C如何从va_arg获取函数指针类型的参数

C如何从va_arg获取函数指针类型的参数,c,C,我知道,如果我将一个类似于void(*func)(void*)的参数传递给一个变量函数,我可以检索如下参数: void (*func)(void *) = va_arg( args, void (*)(void) ); 如果我传递类似于void(**func)(void*)的内容,该怎么办?使用va_arg检索此类参数的正确语法是什么?与您提到的相同: typedef void (** func_t)(void *); func_t ppf; va_list vl; va_start(vl,n

我知道,如果我将一个类似于
void(*func)(void*)
的参数传递给一个变量函数,我可以检索如下参数:

void (*func)(void *) = va_arg( args, void (*)(void) );

如果我传递类似于
void(**func)(void*)
的内容,该怎么办?使用
va_arg
检索此类参数的正确语法是什么?

与您提到的相同:

typedef void (** func_t)(void *);
func_t ppf;
va_list vl;
va_start(vl,n);
ppf = va_arg(vl, func_t);
...

坦率地说,您的代码不符合标准。宏的第二个参数有一个很小的限制:

。。。参数
type
应为指定的类型名称,以便 可以获取指向具有指定类型的对象的指针的 只需将*后固定到类型

据此,在这种情况下,类似于
void(*)(void*)
的符号是不可接受的。因为简单的
*
追加不会给您指向函数指针的指针。您只能使用
typedef
-ed别名:

typedef void (*func_ptr)(void *);
typedef void (**ptr_to_func_ptr)(void *);

func_ptr var1 = va_arg(ap, func_ptr);
ptr_to_func_ptr var2 = va_arg(ap, ptr_to_func_ptr);

为了帮助指针指向函数,我总是使用
typedef
,如下所示:

typedef void VoidFn(void *); // Function accepts void * and returns nothing.
它将函数的原型声明为
typedef
,允许在其他地方使用
typedef

这样,如果您具有此功能:

void SomeFn(void *) {...}
您可以声明此指针:

VoidFn *fnPtr = &SomeFn; // A pointer to such a function.
这样一来,独立于指针更改原型就更容易了,这有助于。。。复杂结构:

typedef void *VoidPtrFn(void *); // Function takes a void *, returning a void *

void *SomeOtherFn(void *) { ... }
VoidPtrFn *otherFnPtr = &SomeOtherFn;
VoidPtrFn **otherFnPtrPtr = &otherFnPtr;