【发布时间】:2011-04-30 18:33:50
【问题描述】:
在许多程序中,#define 的作用与常量相同。例如。
#define FIELD_WIDTH 10
const int fieldWidth = 10;
我通常认为第一种形式优于另一种形式,它依赖于预处理器来处理基本上是应用程序决策的事情。这种传统有原因吗?
【问题讨论】:
-
请注意,对于整数常量,您还可以使用像 ``enum {FIELD_WIDTH = 10};'' 中的枚举,如果您需要函数范围内的编译时常量,这将很有用。
-
你也可以在函数范围内#define,尽管你必须记住在函数结束时#undef它
-
@CashCow:没错,但是您在文件范围内取消定义可能的#define(可能已在您自己未编写的包含文件中定义)。
-
@Jochen:当与另一个宏定义发生冲突时,您的 #define 已经覆盖了之前的定义并且您忽略了编译器警告,因此您也可以 #undef 它并生成在代码中进一步使用宏时出现编译器错误,提醒您应该更改函数范围宏的宏名称。
-
@Secure:当然,但是你必须处理名称冲突。局部作用域的优点是可以避免它。当然,使用本地枚举也不是万无一失的:如果全局 #define 将 FIELD_WIDTH 重写为其他值,例如 20,则枚举将被重写为
`enum {20 = 10};`如果 FIELD_WIDTH 的全局和本地定义都是枚举,但,这两种定义确实共存(局部定义遮蔽了全局定义)。 (有关此主题的更多信息,请参阅eetimes.com/discussion/programming-pointers/4023879/…。
标签: c coding-style c-preprocessor