【问题标题】:Function like macro passed as an argument. Compiler error coming [closed]像宏一样的函数作为参数传递。编译器错误来了[关闭]
【发布时间】:2021-11-09 18:16:46
【问题描述】:

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

#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

【问题讨论】:

  • 阅读How to Ask 并获取tour
  • 你不能在 C 中做到这一点。
  • 这看起来真的是一个 XY 问题。你想达到什么目的?
  • 请注意,宏的扩展是无效的 C 除非关键字 void#define。请注意,display() 的参数不是对类函数宏的调用。

标签: c function compiler-errors


【解决方案1】:

“函数类似于宏”表示宏函数一样工作。这并不意味着它是一个函数。你不能传递这样的宏。

【讨论】:

  • 有什么替代方法可以做到这一点。
  • @HarshJain 使用函数而不是宏之类的函数
【解决方案2】:

函数宏仅在像函数一样使用时才被扩展。因此,只有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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2020-01-07
    相关资源
    最近更新 更多