【问题标题】:Invoke function instead of macro in C在 C 中调用函数而不是宏
【发布时间】:2013-03-27 07:57:30
【问题描述】:

我的问题是:如果你有一个宏和一个同名的函数,那么只会调用宏,对吗?如果我想调用函数而不是宏怎么办?

【问题讨论】:

    标签: c macros


    【解决方案1】:

    如果你有一个函数和一个类似函数的宏都命名为foo,并且想要调用函数版本,你可以这样做:

    (foo)(args)
    

    这是可行的,因为类似函数的宏名称必须后跟带括号的参数列表才能进行替换。

    这在 ISO C99 标准的第 7.1.4/1 节中有所提及:

    在头文件中声明的任何函数都可以额外实现为头文件中定义的类函数宏,因此如果在包含头文件时显式声明库函数,则可以使用下面显示的技术之一来确保声明不受此类宏的影响。函数的任何宏定义都可以通过将函数的名称括在括号中来在本地抑制,因为该名称后面没有表示宏函数名称扩展的左括号。出于同样的语法原因,即使库函数也被定义为宏,也允许获取库函数的地址。使用#undef 删除任何宏定义也将确保引用实际函数。

    但是,如果您需要这样做,您可能应该在代码中添加 cmets 来解释它,因为它看起来有点奇怪并且不是常见的做法。如果可行,从长远来看,重命名函数以避免名称冲突可能更易于维护。

    【讨论】:

    • 旁注,C++的情况完全一样。
    • 是的,原始问题的方法散发着下游维护恐怖的味道。如果他不得不这样做,那就是这样。
    【解决方案2】:

    重命名两者之一。或者,如果这不可能,请在定义宏并通过该指针调用函数之前创建指向原始函数的函数指针。

    【讨论】:

    • 宏不会干扰获取该函数地址。 foo&foo 不会导致类似函数的宏调用。不过,这是类对象宏的正确解决方案。
    【解决方案3】:

    在调用之前提供技巧

    #ifdef foo
    #undef foo
    #endif //
    

    因此,在本地调用函数的单个文件中,您将始终具有显式行为

    【讨论】:

    • 但是没有办法备份和恢复一个宏,所以你必须在函数调用之后永远不要使用它。
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多