我正在阅读K&R书,这个问题出现了.如何最好地决定某些东西应该是自己的变量还是被定义为符号常量?
假设我们正在处理const int myNumber = 12;
,#define MY_NUMBER 12
在确定需要创建变量或使用符号常量时,应该遵循一个经验法则吗?
真正的问题是n
应该是声明的const
对象还是宏.(问题标题目前指的是"变量或符号常数".)
这个:
const int myNumber = 12;
Run Code Online (Sandbox Code Playgroud)
使myNumber
const
但不是恒定的.该const
关键字意味着,你不允许修改它适用的对象,但它并不能使它不变.例如,开关标签必须是恒定的; 你不能写:
switch (n) {
case myNumber:
...
}
Run Code Online (Sandbox Code Playgroud)
因此,如果您需要myNumber
在需要常量表达式的上下文中使用,则上述操作无效.
另一方面,一个宏:
#define MY_NUMBER 12
Run Code Online (Sandbox Code Playgroud)
意味着任何使用MY_NUMBER
都被文字所取代12
,这是不变的.宏的一个缺点是它们不像声明的对象那样具有范围; MY_NUMBER
从定义到源文件末尾可以看到名称,这可能会导致冲突.(请注意,宏名称通常以全部大写形式编写,特别是为了引起对它们的注意.)实际上,处理宏的预处理器是另一种语言.
对于常量类型int
,你可以使用另一种技巧(我不认为K&R会提到这一点):
enum { myNumber = 12 };
Run Code Online (Sandbox Code Playgroud)
这将创建一个匿名枚举类型,您实际上不会使用它. myNumber
实际上是类型int
,而不是枚举类型,你可以像使用文字一样使用它12
.您甚至可以使用表达式来定义其值,只要表达式是常量:
enum { myNumber = 3 * 4 };
Run Code Online (Sandbox Code Playgroud)
(C++有不同的规则.在C++中,const int myNumber = 12;
确实生成myNumber
一个常量表达式 - 枚举常量是枚举类型,而不是类型int
.)