-2

当我将宏之类的函数作为参数传递给另一个声明为函数指针参数的函数时。我无法运行出现编译时错误的代码。

#include <stdio.h> 
#define print_numbers() (void (0)) 

void display(void (*p)()) 
{ 
    for(int i=1;i<=5;i++) 
    { 
        p(); 
    }
} 

int main() { 
    void (*p)(int); // void function pointer declaration 
    printf("The values are :"); 
    display(print_numbers); return 0; 
} 

错误

prog.c: In function ‘main’: prog.c:16:13: error: ‘print_numbers’ undeclared (first use in this function) 
    display(print_numbers); 
            ^ 
prog.c:16:13: note: each undeclared identifier is reported only once for each function it appears in
4

2 回答 2

2

“函数像宏”是指宏函数一样工作。这并不意味着它是一个函数。你不能传递这样的宏。

于 2021-09-14T14:50:37.050 回答
1

函数宏只有在像函数一样使用时才会被扩展。所以只会print_numbers()扩大到不会(void(0))print_numbers

如果您希望它扩展,请将宏定义为:

#define print_numbers (void (0)) 

生成的代码是否编译的问题是一个单独的主题。


编辑

但是,可以将类似函数的宏传递给另一个类似函数的宏。只是做display一个宏而不是一个函数。

#define display(p) for(int i=1;i<=5;i++) p()

现在display(print_numbers)将扩展到

for(int i=1;i<=5;i++) (void (0));
于 2021-09-14T15:09:18.487 回答