繁体   English   中英

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

[英]C how to get argument of type pointer to function from va_arg

我知道如果将像void (*func)(void *)这样的参数传递给可变参数函数,我可以像这样检索该参数:

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

如果我传递了void (** func)(void *)怎么办? 使用va_arg检索此类型的参数的正确语法是什么?

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

...参数type应该是指定的类型名称,以便可以通过后缀*来简单地获得指向具有指定类型的对象的指针的类型。 ...

因此,在这种情况下,像void (*)(void *)这样的符号是不可接受的。 由于简单的*附加不会为您提供指向函数的指针。 您只能使用typedef别名:

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 void (** func_t)(void *);
func_t ppf;
va_list vl;
va_start(vl,n);
ppf = va_arg(vl, func_t);
...

为了帮助指向函数,我总是使用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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM