我知道如果我将类似void (*func)(void *)
的参数传递给可变函数,我可以检索如下参数:
void (*func)(void *) = va_arg( args, void (*)(void) );
如果我传递void (** func)(void *)
之类的内容怎么办?使用va_arg
检索此类型参数的正确语法是什么?
答案 0 :(得分:5)
坦率地说,您的代码不符合标准。 va_arg()
宏的第二个参数有一个小的限制:
...参数
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);
答案 1 :(得分:1)
与你提到的相同:
private void drawShade(float left,float top,float right,float bottom){
//this method draws shade on bitmap. Coordinates are sent from onTouchEvent
TAG = "drawShade";
//parseTouchPointsString();
Bitmap tempBitmap = Bitmap.createBitmap(bill.getWidth(), bill.getHeight(), Bitmap.Config.RGB_565);
Log.d(TAG,"bill:"+bill.isMutable()+"tempBit:"+tempBitmap.isMutable()+"");
Canvas tempCanvas = new Canvas(tempBitmap);
tempCanvas.drawBitmap(bill,0,0,null);
tempCanvas.drawRoundRect(new RectF(left,top,right,bottom), 10, 10, shadePaint);
imgView.setImageDrawable(new BitmapDrawable(getResources(), tempBitmap));
if(fingerUp) {
Log.e("fingerUp",fingerUp+"");
bill = tempBitmap;
}
Log.d(TAG,"shade drawn at:"+left+","+top+","+right+","+bottom);
}
答案 2 :(得分: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;