如何使用宏作为函数指针?

问题描述 投票:0回答:4

如何使用宏作为函数指针?我不知道如何解决这个问题。我创建了一个草图(不起作用,充满语法错误)来展示我试图完成的任务。请帮忙!

#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
}
c++ macros function-pointers
4个回答
3
投票

宏由预处理器处理。它们不存在于编译后的代码中,因此没有指针。

在现代代码中您应该遵循一条规则,该规则是“不要对功能使用宏”。函数宏是一个遗留物,仍然有一些很好的用途,但它们非常罕见。

只需声明一个普通函数即可

int do_out(int x) {
    return x / 1024 * 100;
}

另请参阅 “静态常量”与“#define”与“枚举”


0
投票

您可以,但不建议,将宏用作命名 lambda。这样

#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 中使用。


0
投票

我知道这是一个旧线程..

假设你不能仅仅将宏更改为函数。也许它是某个库驱动程序的一部分,并且您需要出于某种原因(例如单元测试)将其传递到另一个函数中。您可以将宏包装在您想要使用它的 .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);

如果您可以完全控制正在编写的代码,那么就不要使用宏。


0
投票

我刚刚得到了使用宏作为函数指针的技巧,我完全删除了括号。我在这两种情况下都工作,就像正常的函数调用和函数指针一样。我不知道它会在哪里引起问题。

    void my_function(int x) 
    {
        printf("Value: %d\n", x);
    }
    
    #define MY_MACRO my_function
    
    // Function taking a function pointer as an argument
    void call_function(void (*func_ptr)(int), int value) 
    {
        func_ptr(value);
    }
    
    int main() 
    {
        // Use the macro as a function pointer by bypassing parentheses
        call_function(MY_MACRO, 42);
        return 0;
    }
© www.soinside.com 2019 - 2024. All rights reserved.