我知道,如果我通過像void (*func)(void *)
的參數時可變參數函數,我可以檢索類似的說法得到函數指針類型的參數:Ç如何從va_arg的
void (*func)(void *) = va_arg(args, void (*)(void));
如果我通過類似void (** func)(void *)
?使用va_arg
檢索此類型的參數的正確語法是什麼?
我知道,如果我通過像void (*func)(void *)
的參數時可變參數函數,我可以檢索類似的說法得到函數指針類型的參數:Ç如何從va_arg的
void (*func)(void *) = va_arg(args, void (*)(void));
如果我通過類似void (** func)(void *)
?使用va_arg
檢索此類型的參數的正確語法是什麼?
作爲坦率地說,你的代碼是不符合標準。存在用於va_arg()
宏的第二個參數一個微小的限制:
...參數
type
應指定這樣的類型名稱的指針的對象已指定類型可以得到 的類型 只需通過postfixing *來鍵入。 ...
據此,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 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;