如何确定n应该是const对象还是符号常量(宏)?

Jam*_*sev 2 c

可能重复:
c中的"static const"vs"#define"

我正在阅读K&R书,这个问题出现了.如何最好地决定某些东西应该是自己的变量还是被定义为符号常量?

假设我们正在处理const int myNumber = 12;,#define MY_NUMBER 12在确定需要创建变量或使用符号常量时,应该遵循一个经验法则吗?

Kei*_*son 6

真正的问题是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.)