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

时间:2016-11-21 07:14:18

标签: c

我知道如果我将类似void (*func)(void *)的参数传递给可变函数,我可以检索如下参数:

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

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

3 个答案:

答案 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;