如何使用宏作为功能指针

How to use macro as function pointer?

本文关键字:功能 指针 何使用      更新时间:2023-10-16

如何将宏作为函数指针?我不知道解决这个问题。我创建了一个草图(不起作用,充满语法错误),以显示我要完成的工作。请帮助!

#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);

如果您对正在编写的代码有完全控制,则只是不使用宏。