像宏一样的函数作为参数传递。编译错误来了

Function like macro passed as an argument. Compiler error coming

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

#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

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

函数宏被扩展只有如果它们像函数一样使用。因此只有 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));