如何使用宏函数的函数指针

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

为什么当我使用函数指针作为宏函数时它不起作用,如下所示?

int func(int a, int b)
{
    return a*b;
}

#define multiple1(num) func(1u, num)
#define multiple2(num) func(2u, num)

typedef int (*func_multiple) (int a);

func_multiple func_array[] = {multiple1, multiple2};

我想知道这里出了什么问题?

function function-pointers
1个回答
0
投票

直接对宏函数使用函数指针将无法按预期工作,因为宏不是函数——它们是预处理器指令。当您定义宏时,它本质上是在编译过程之前执行文本替换。

解决方案

您应该使用实际的函数,而不是使用宏。您可以定义内联函数或常规函数来执行与宏相同的操作。以下是如何修改代码以正确使用函数指针的方法:

#include <stdio.h>

// Original function
int func(int a, int b) {
    return a * b;
}

// Function replacements for the macros
int multiple1(int num) {
    return func(1u, num);
}

int multiple2(int num) {
    return func(2u, num);
}

// Define the function pointer type
typedef int (*func_multiple) (int a);

// Create an array of function pointers
func_multiple func_array[] = {multiple1, multiple2};

int main() {
    int num = 5;

    // Test the function pointers
    printf("multiple1(%d) = %d\n", num, func_array[0](num)); // should output 5
    printf("multiple2(%d) = %d\n", num, func_array[1](num)); // should output 10

    return 0;
}

这样,您就可以避免与宏扩展相关的问题,并确保函数指针的类型安全。

© www.soinside.com 2019 - 2024. All rights reserved.