【问题标题】:Macro with function parameter which calls the function带有调用函数的函数参数的宏
【发布时间】:2018-10-12 15:30:48
【问题描述】:

我需要一个宏,它只调用作为参数传递给该宏的函数。该函数是无参数的void类型。

例如,如果我有以下功能:

void function(void) {
//doSomething
}

我需要一个宏,APPLY_FUNCTION,它使用 function 参数调用并简单地调用该函数:

APPLY_FUNCTION(function);

我尝试定义如下宏:

#define APPLY_FUNCTION(function)    (function)

但它不起作用,当我尝试调用宏时,我收到“没有效果的语句”错误。

问题是我应该如何定义那个宏?

【问题讨论】:

  • 拥有这个宏有什么意义?为什么不直接调用函数呢?
  • 这可能是XY problem。事实上,这样的宏完全没有用。但是“应用”敲响了警钟,您是否正在尝试实现Apply HOF?这不适用于宏。

标签: c macros


【解决方案1】:

快速而肮脏的版本就是这样:

#define APPLY_FUNCTION(function) (function)()

末尾的() 表示这是一个函数调用。


不过,我更喜欢使用类型安全的 C11 版本:

#define APPLY_FUNCTION(function) _Generic((function), void (*)(void): (function)())

这可以防止用户将错误类型的函数传递给宏。

【讨论】:

    【解决方案2】:

    你可能想要这个:

    #include <stdio.h>
    
    #define APPLY_FUNCTION(functionname) functionname()
    
    void function(void) {
      printf("Function called\n");
    }
    
    int main()
    {
      APPLY_FUNCTION(function);
    }
    

    输出:

    Function called
    

    根据你的定义:

    #define APPLY_FUNCTION(function)   (function)
    

    预处理器生成以下行:

    (function);
    

    这在语法上是正确的,但它不调用函数,因此发出警告。

    顺便说一句:你应该调用宏而不是CALL_FUNCTION。你不应用一个函数,你调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2015-07-12
      相关资源
      最近更新 更多