我不知道我想做什么是可能的,但是我会感激不尽。它将真正证明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而且我不知道如果可能的话我该怎么做呢。感谢您的想法,解释和帮助!
答案 0 :(得分:2)
好的,如果我理解你的问题,那么你正在寻找一种方法,只允许某些函数作为参数传递给你的DLL函数。
使用typedef将不起作用,因为它只是创建一个别名; Action
和void (*)()
与代码中的编译器无法区分。相反,你必须创建一个全新的类型。在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());
答案 1 :(得分:2)
首先,函数类型typedef
的正确语法是
typedef void (*Action)();
其次,函数类型的typedef-name可以用于声明该类型的函数,但它们不能用于定义这样的函数。即如果FunctionToExecute
是您通过指针执行的函数,则必须将其定义为
void FunctionToExecute() {
/* whatever */
}
调用函数将被定义为
void RunFunction(ACTION p) {
p();
}
对它的调用如下:
RunFunction(FunctionToExecute);
就是这样。一元*
和&
运算符是函数指针的可选项。