2016-11-21 17 views
2

我知道,如果我通過像void (*func)(void *)的參數時可變參數函數,我可以檢索類似的說法得到函數指針類型的參數:Ç如何從va_arg的

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

如果我通過類似void (** func)(void *)?使用va_arg檢索此類型的參數的正確語法是什麼?

回答

5

作爲坦率地說,你的代碼是不符合標準。存在用於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); 
1

同你提到:

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

爲了幫助指針到函數,我總是使用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;