为啥将宏参数放在括号中会导致错误? [关闭]

Posted

技术标签:

【中文标题】为啥将宏参数放在括号中会导致错误? [关闭]【英文标题】:Why putting a macros argument in parentheses leads to an error? [closed]为什么将宏参数放在括号中会导致错误? [关闭] 【发布时间】:2018-07-24 16:23:40 【问题描述】:

我有一个关于 c++ 中预处理器指令的非常有趣的问题。

考虑以下宏及其用法:

    #define FUNCTION(a, b) void (a)(int &current, int candidate)\
    \
        if ((current b candidate) == false)\      // Marked Line    
            current = candidate;\
        \
    

    FUNCTION(minimum, <)
    FUNCTION(maximum, >)

我的问题是为什么用以下代码行更改“标记线”甚至无法编译:

     ... if ((current (b) candidate) == false) ...

【问题讨论】:

因为(&lt;) 无效。不使用宏试试。 您的错误与宏无关。 See for yourself. 不显示有效的代码,而是显示无效的代码。 为什么不直接使用仿函数,比如 std::greater 或 std::less? 你最好用模板来做 【参考方案1】:

因为 '

bool LessThan( int a, int b )

    return( a (<) b );

至少你应该看到“expected an expression”或类似的错误。

【讨论】:

好的。我明白了,但是将宏参数放在括号中是什么意思? 见this question/answer 通常人们建议您将参数放在括号中,因为宏预处理器会执行非常简单的文字替换,这可能会导致错误的代码。当宏参数是运算符而不是表达式时,建议会失效。 谢谢你,蒂姆。感谢您的帮助!

以上是关于为啥将宏参数放在括号中会导致错误? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 MPI_Barrier 在 C++ 中会导致分段错误

JavaScript - 为啥包含括号会导致三元表达式错误?

为啥 getFragmentManager 会导致 Incompatible Type 错误? [关闭]

为啥idea会弹出一个错误,叉掉导致idea关闭

为啥将 lambda 传递给受约束的类型模板参数会导致“不完整类型”编译器错误?

为啥 Corona sdk 中会出现此错误?