parens数字的意义

时间:2012-04-18 17:35:10

标签: c

这是来自库的C代码片段:

typedef enum
{
/** 
  * @brief  SDIO specific error defines  
  */   
  SD_CMD_CRC_FAIL                    = (1), /*!< Command response received (but CRC check failed) */
  SD_DATA_CRC_FAIL                   = (2), /*!< Data bock sent/received (CRC check Failed) */
  SD_CMD_RSP_TIMEOUT                 = (3), /*!< Command response timeout */
  SD_DATA_TIMEOUT                    = (4), /*!< Data time out */

我不理解1234周围的parens的含义。 SD_CMD_CRC_FAIL = 1SD_CMD_CRC_FAIL = (1)是否等效?

3 个答案:

答案 0 :(得分:4)

是的,它们是等价的。

我不知道为什么作者选择这样写(虽然看一些理论对这个答案的评论)。

答案 1 :(得分:3)

单个值附近的括号是可选的,并且没有隐藏的魔法附加。 (1)只会评估为1,如果它不是某些函数调用的一部分(即分隔参数)。

就像在数学中一样,您可以在不改变x = ((5) + (3))等表达式含义的情况下添加多个括号级别。

答案 2 :(得分:1)

括号在这种特殊情况下没有区别,但使用一对括号始终环绕宏表达式是个好主意。代码的作者可能将宏定义转换为enum,并且parens仍然是旧代码的剩余部分。

<小时/> 顺便说一下,这就是这个规则的原因。请考虑以下代码:

#define FOUR 2 + 2
...
int x = 2 * FOUR;

最后一行将由预处理器转换为int x = 2 * 2 + 2;,并将评估为6而不是8,正如您所期望的那样。如果用周围的parens定义FOUR,则不会发生这种情况:

#define FOUR (2 + 2)