您好我正在尝试学习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;
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何将函数指针传递foo到function-setter引用功能.有人可以帮我解决这个问题.我相信这个宣言
functionsetter 代码有问题,请让我知道如何修复它.
我正在尝试编译它 g++ -O2 -g -Wall -DADD main.cpp -o main
注意:我想在其他地方的其他代码中使用这样的预处理器标志和函数指针.如果这样的事情是一个好主意/实践,请告诉我.
Jon*_*rdy 11
不使用a typedef,函数指针的引用语法是:
void functionsetter(void (*&ptr2fun)(int, int)) { ... }
Run Code Online (Sandbox Code Playgroud)
但是typedef为指针类型创建一般更简单:
typedef void (*FunctionPointer)(int, int);
void functionsetter(FunctionPointer& ptr2fun) { ... }
Run Code Online (Sandbox Code Playgroud)
或者对于函数类型:
typedef void Function(int, int);
void functionsetter(Function*& ptr2fun) { ... }
Run Code Online (Sandbox Code Playgroud)
使用typedef:
typedef void (*MyFunctionPointer)(int,int);
void functionsetter(MyFunctionPointer& fp);
Run Code Online (Sandbox Code Playgroud)
我想在其他地方的其他代码中使用这样的预处理器标志和函数指针.如果这样的事情是一个好主意/实践,请告诉我.
不,不是真的.从你的例子中不清楚你想要完成什么,但你的实现是相当不寻常的.考虑使用虚拟成员函数或std::function在运行时切换函数实现,或者(可能)模板在编译时切换它们.使用条件编译进行静态选择是没有错的,但是将它与函数指针混合有点奇怪.
如果不能很好地理解您试图解决的问题,就很难就如何最好地解决问题给出好的建议.
| 归档时间: |
|
| 查看次数: |
7130 次 |
| 最近记录: |