簡體   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