您好我正在尝试学习C / C ++中的一些函数指针,我试图在Ubuntu上用gcc编写以下C ++代码。
此代码应执行multiply或者add函数,具体取决于 编译期间提供的预处理程序标志-DADD或-DMULTIPLY
#include <iostream>
#include <iomanip>
//Adds two numbers
int add(int a, int b)
{
return a+b;
}
//Multiplies two numbers
int multiply(int a, int b)
{
return a*b;
}
//Function to set the correct function to be executed.
//All functions here should have the same signature.
void functionsetter( void (*ptr2fun)(int,int) )
{
#ifdef ADD
ptr2fun = add;
#endif
#ifdef MULTIPLY
ptr2fun = multiply
#endif
}
int main(int argc, char *argv[])
{
int a = 5;
int b = 6;
void (*foo)(int,int);
functionsetter(foo);
return 0;
}
我无法弄清楚如何通过引用将函数指针foo
传递给function-setter
函数。有人可以帮我解决这个问题。我相信
functionsetter
错误,请告诉我如何修复它。
我正在尝试使用g++ -O2 -g -Wall -DADD main.cpp -o main
注意:我想在其他地方的其他代码中使用这样的预处理器标志和函数指针。 如果这样的事情是个好主意,请告诉我。
答案 0 :(得分:11)
不使用typedef
,函数指针引用的语法是:
void functionsetter(void (*&ptr2fun)(int, int)) { ... }
但是为指针类型创建typedef
通常更简单:
typedef void (*FunctionPointer)(int, int);
void functionsetter(FunctionPointer& ptr2fun) { ... }
或者对于函数类型:
typedef void Function(int, int);
void functionsetter(Function*& ptr2fun) { ... }
答案 1 :(得分:5)
使用typedef
:
typedef void (*MyFunctionPointer)(int,int);
void functionsetter(MyFunctionPointer& fp);
我想在其他地方的其他代码中使用这样的预处理器标志和函数指针。如果这样的事情是个好主意,请告诉我。
不,不是真的。从你的例子中不清楚你想要完成什么,但你的实现是相当不寻常的。考虑使用虚拟成员函数或std::function
在运行时切换函数实现,或者(可能)模板在编译时切换它们。使用条件编译进行静态选择是没有错的,但是将它与函数指针混合有点奇怪。
如果没有很好地理解你想要解决的问题,很难就如何最好地解决它提出好的建议。
答案 2 :(得分:1)
您将签名更改为:
void functionsetter( void (*&ptr2fun)(int,int) )
请注意,ptr2fun函数指针的签名错误,add和multiply函数返回一个int,因此ptr2fun
如果使用typedef,这会变得容易得多:
typedef int (*ptr2fun)(int,int);
void functionsetter(ptr2fun& func) { ...
虽然,我个人只是返回函数指针。
ptr2fun functionsetter()
{
#ifdef ADD
return add;
#endif
#ifdef MULTIPLY
return multiply
#endif
}
答案 3 :(得分:1)
首先,你没有将函数指针 reference 传递给方法,你只是传递一个函数指针。您需要将方法签名更改为
void functionsetter( void (*&ptr2fun)(int,int) )
此外,您的方法签名在某些地方为void(*)(int,int)
,在某些地方为int(*)(int,int)
,因为您的add和multiply方法返回int
,所以它们可能应该是后者,因为<{1}}。
也就是说,既然你正在使用C ++,那么以这种方式操作指针并不是我推荐的,C ++有继承/虚方法,通常可以取代大多数函数指针使用,并使代码更具可读性和可扩展性