C 为什么要打右旋球
请参阅以下C代码片段:C 为什么要打右旋球,c,C,请参阅以下C代码片段: PM_RAISE(retexn, exn) do { retexn = (exn); gVmGlobal.errFileId = __FILE_ID__; gVmGlobal.errLineNum = (uint16_t)__LINE__; } while (0) 在第4行,为什么exn用括号括起来 EDIT(回复IntermediateHacker)
PM_RAISE(retexn, exn)
do
{
retexn = (exn);
gVmGlobal.errFileId = __FILE_ID__;
gVmGlobal.errLineNum = (uint16_t)__LINE__;
} while (0)
在第4行,为什么exn
用括号括起来
EDIT(回复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)。将宏参数括在括号中被认为是良好的做法。在您的示例中,这没有多大帮助,但可以说您有:
#define multiply(a, b) a * b
并将其用于:
multiply(4 + 3, 2)
它将扩展到
4 + 3 * 2
这显然不是预期的结果(3将首先乘以2)。好吧,这是我的猜测工作,但我认为它可以作为
exn
输入算术表达式
我的意思是:
/ * If I use: */
PM_RAISE( whatever, 18 / 9 + 5 );
/* It will generate */
whatever = (18 / 9 + 5);
/* which is good. */
此外,在@James指出的宏函数中包含括号也是一种很好的做法。好吧,这是我的猜测工作,但我认为它可以作为
exn
输入算术表达式
我的意思是:
/ * If I use: */
PM_RAISE( whatever, 18 / 9 + 5 );
/* It will generate */
whatever = (18 / 9 + 5);
/* which is good. */
此外,在@James指出的宏函数中包含括号也是一种很好的做法。这可能是一些宏或定义。显示更多代码。对我来说,它看起来像一个宏定义,所以您可以将其重新格式化,包括
#define
?这是一个宏吗?您是否省略了#define
和\s?@IntermediateHacker:我又添加了一些代码。我看不到更多相关内容。可能是一些宏或定义。显示更多代码。对我来说,它看起来像一个宏定义,所以您可以将其重新格式化,包括#define
?这是一个宏吗?您是否省略了#define
和\s?@IntermediateHacker:我又添加了一些代码。我看不到更多相关的东西。没有括号,它只会是whatever=18/9+5代码>。这有什么不对?如果没有括号,它只会是whatever=18/9+5代码>。怎么了?