发送void类型定义的函数指针作为要调用的参数

时间:2012-07-01 15:47:36

标签: c++ function pointers arguments

我不知道我想做什么是可能的,但是我会感激不尽。它将真正证明C ++是一种强大的语言。

所以,我有一个DLL和一个使用DLL导出的函数的EXE。该函数接受一个参数,该参数是或必须是指向另一个函数的指针,并执行它。像这样:

extern void RunFunction(void (*FunctionPonter)()) {
    (*FunctionPonter)();
}

我称之为:

RunFunction(&FunctionToExecute);

作为参数发送的函数不会有参数,只是一个void函数。

所以,这一切都有效,正如这里所介绍的那样。现在,我想进一步将(*void)()定义为Action

typedef (*void)() Action;

Action FunctionToExecute() {
    // My code. This function won't return results - void
}

我想将指针发送到我的DLL中的函数,如下所示:

// This is how it would be declared now in the DLL
extern void RunFunction(void (ACTION) {
    (*FunctionPonter)();
}

// and this is how I would like to use it
RunFunction(FunctionToExecute);

我正在使用VC2010而且我不知道如果可能的话我该怎么做呢。感谢您的想法,解释和帮助!

2 个答案:

答案 0 :(得分:2)

好的,如果我理解你的问题,那么你正在寻找一种方法,只允许某些函数作为参数传递给你的DLL函数。

使用typedef将不起作用,因为它只是创建一个别名; Actionvoid (*)()与代码中的编译器无法区分。相反,你必须创建一个全新的类型。在C ++中,您应该强烈考虑使用functor

// Abstract functor
struct Action {
    virtual void operator() () const = 0;
};

// The DLL function
void RunFunction(const Action &action) {
    action();
}

// Define your function as a derived functor
struct FunctionToExecute : Action {
    void operator() () const { std::cout << "Hello\n"; }
};

// Run a function
RunFunction(FunctionToExecute());

演示:http://ideone.com/5pl23

答案 1 :(得分:2)

首先,函数类型typedef的正确语法是

typedef void (*Action)();

其次,函数类型的typedef-name可以用于声明该类型的函数,但它们不能用于定义这样的函数。即如果FunctionToExecute是您通过指针执行的函数,则必须将其定义为

void FunctionToExecute() {
  /* whatever */
}

调用函数将被定义为

void RunFunction(ACTION p) {
  p();
}

对它的调用如下:

RunFunction(FunctionToExecute);

就是这样。一元*&运算符是函数指针的可选项。