请参阅以下C代码片段:

PM_RAISE(retexn, exn)
        do
        {
            retexn = (exn);
            gVmGlobal.errFileId = __FILE_ID__;
            gVmGlobal.errLineNum = (uint16_t)__LINE__;
        } while (0)

在第四行,为什么exn被括号包围?
编辑(回复IntermediateHacker)以下是原始代码片段:
#if __DEBUG__
#define PM_RAISE(retexn, exn) \
        do \
        { \
            retexn = (exn); \
            gVmGlobal.errFileId = __FILE_ID__; \
            gVmGlobal.errLineNum = (uint16_t)__LINE__; \
        } while (0)
#else
#define PM_RAISE(retexn, exn) \
        retexn = (exn)
#endif

最佳答案

把宏参数用括号括起来被认为是一种很好的做法。这对你的例子没有多大帮助,但是你说你有:

#define multiply(a, b) a * b

并将其用于:
multiply(4 + 3, 2)

它将扩展到
4 + 3 * 2

这显然不是预期的结果(3将首先乘以2)。

10-08 04:11