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;