如何使用宏作为功能指针
How to use macro as function pointer?
如何将宏作为函数指针?我不知道解决这个问题。我创建了一个草图(不起作用,充满语法错误),以显示我要完成的工作。请帮助!
#define D0_OUT(x) (x/1024*100) //I want to use this for Pin0 calculation
#define D1_OUT(x) (x*1024) //I want to use this for Pin1 calculation
struct Pin {
CalcMethod *calcMethod; //int methodName(int x) { return MACRO(x); }
Pin(CalcMethod *calcMethodParam) {
calcMethod = calcMethodParam;
}
int calc(int x) {
return calcMethod(x);
}
};
#define PIN_COUNT 2
Pin *pins[PIN_COUNT];
void start() {
pins[0] = new Pin(D0_OUT); //use the D0_OUT macro to calculate
pins[1] = new Pin(D1_OUT); //use the D1_OUT macro to calculate
int pin0CalcResult=pins[0]->calc(5); // =5/1024*100
int pin1CalcResult=pins[1]->calc(6); // =6*1024
}
宏由预处理器处理。它们不存在于编译的代码中,因此没有指针。
您应该在现代代码中遵循一个规则,该规则是"不要将宏用于家具"。功能的宏是一种仍然有很好用途的遗物,但它们非常罕见。
只是声明正常函数
int do_out(int x) {
return x / 1024 * 100;
}
也请参见"静态const"。vs"#定义"vs" enum"
您可以,但是不建议,将宏作为命名lambdas。因此
#define D0_OUT [](int x) { return x / 1024 * 100; }
#define D1_OUT [](auto x) { return x * 1024; }
它应该起作用。
d0_out示例在C 11中可用,D1_OUT可在C 14中使用。
我知道这是一个旧线程。
假设您不能仅将宏变为函数。也许它是图书馆驱动程序的一部分,您需要出于某种原因将其传递到另一个功能,例如单元测试。您可以将宏包装在要使用的.c文件中。
所以:
#define D0_OUT(x) (x/1024*100) //I want to use this for Pin0 calculation
变为:
static int D0_OUT_wrapper(int x)
{
return D0_OUT(x);
}
所以包装器像普通一样进行:
pins[0] = new Pin(D0_OUT_wrapper);
如果您对正在编写的代码有完全控制,则只是不使用宏。
相关文章:
- 如何定义和设置指向模板类方法的功能指针
- 将状态传递给功能指针
- 如何使用结构内的功能指针调用私有函数
- 功能指针不起作用(C )
- 将C 方法作为功能指针传递
- 优化调用一系列功能指针
- C 功能指针和成员功能指针
- 当直接分配时,为什么此功能指针分配起作用,而不是与有条件的操作员一起使用
- 功能指针的静态初始化
- 功能指针参数参数转换为const
- 使用lambda在功能指针铸造时双免费
- 如何在两个类之间使用功能指针
- exc_bad_access on for loop(数组功能指针)
- 如何通过功能指针调用派生方法
- 虚拟功能指针指向派生类中的函数
- C :铸造成员功能指针
- 指向成员功能的功能指针
- 正确施放以指向返回功能的函数的功能指针
- 当用作模板参数时,功能指针是否需要指向具有外部链接的函数
- 在堆中创建功能指针的数组