这是来自库的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
,2
,3
和4
周围的parens的含义。 SD_CMD_CRC_FAIL = 1
和SD_CMD_CRC_FAIL = (1)
是否等效?
答案 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)