2

这是来自库的一段 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 */

我不明白 , , 和 周围的1括号23含义4。是SD_CMD_CRC_FAIL = 1SD_CMD_CRC_FAIL = (1)等价的吗?

4

3 回答 3

4

是的,它们是等价的。

我不知道作者为什么选择这样写(尽管有关某些理论,请参阅对此答案的评论)。

于 2012-04-18T17:37:06.087 回答
3

单个值周围的括号是可选的,并且没有附加任何隐藏的魔法。(1)只会评估1它是否不是某些函数调用的一部分(即定界参数)。

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

于 2012-04-18T17:39:26.120 回答
1

在这种特殊情况下,括号没有任何区别,但最好始终用一对括号括住宏表达式。代码的作者可能将宏定义转换为enum, 并且括号仍然是旧代码的遗留物。


顺便说一句,这就是这个规则的原因。考虑以下代码:

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

如您所料,最后一行将由预处理器转换int x = 2 * 2 + 2;为 6 而不是 8。FOUR如果用周围的括号定义,则不会发生这种情况:

#define FOUR (2 + 2)
于 2012-04-18T17:59:40.820 回答