在 C 语言中,众所周知#define
宏应该使用括号。请参见例如C 宏和括号中参数的使用。
然而,在嵌入式代码中,我经常看到它甚至与整数一起使用。例如:
#define OFFSET (0x100)
当宏只是一个常量整数时,括号有什么意义?他们可以在什么情况下发挥作用?
在 C 语言中,众所周知#define
宏应该使用括号。请参见例如C 宏和括号中参数的使用。
然而,在嵌入式代码中,我经常看到它甚至与整数一起使用。例如:
#define OFFSET (0x100)
当宏只是一个常量整数时,括号有什么意义?他们可以在什么情况下发挥作用?
除非在特定结构中使用宏,否则宏应扩展为单个主表达式或不带尾随分号的单个语句。这样做的原因是为了防止在将宏作为表达式的一部分或作为复合语句中的语句调用时出现运算符优先级问题。
用一组括号包围展开式是确保展开式是主表达式的简单方法。然而,正如您所注意到的,数字常量和字符串文字不需要为此目的使用括号集。
但请注意,建议对负数使用括号,负数是表达式,而不是数值常量,如
因此,对正数和负数使用括号可能是为了保持一致性。
发布的示例似乎是以下一种情况或多种情况的组合:
在大多数情况下,额外的括号没有什么区别。然而,在极端情况下它们会产生一些副作用,无论如何都是错误或恐怖:
func OFFSET
func
将编译为带有单个参数的函数调用0x100
更重要的是,宏参数应该始终用一组括号括起来,除非在扩展中用作函数或宏参数。
我认为这是为了清晰起见,当包含括号时,它使代码更加明确并且更容易为其他开发人员理解。
此外,这还取决于开发人员所熟悉的编码风格。
即使在定义常量整数值时,也最好在宏中使用括号。
这种做法可以帮助您防止微妙的问题和/或使您的代码更易于维护/可读
微妙的问题例如:
根据我的经验,这可能不是。