为什么当我使用函数指针作为宏函数时它不起作用,如下所示?
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};
我想知道这里出了什么问题?
直接对宏函数使用函数指针将无法按预期工作,因为宏不是函数——它们是预处理器指令。当您定义宏时,它本质上是在编译过程之前执行文本替换。
解决方案
您应该使用实际的函数,而不是使用宏。您可以定义内联函数或常规函数来执行与宏相同的操作。以下是如何修改代码以正确使用函数指针的方法:
#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;
}
这样,您就可以避免与宏扩展相关的问题,并确保函数指针的类型安全。