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

C 如何确定n应该是常量对象还是符号常量(宏)?,c,C,可能重复: 我正在翻阅K&R的书,这个问题出现了。如何最好地决定某个东西应该是它自己的变量还是被定义为符号常量 假设我们处理的是const int myNumber=12,也可以是#定义我的编号12在决定是需要创建变量还是使用符号常量时,是否应该遵循经验法则?如果您硬编码一个类似“2”的常量。。。那么它就是符号参数的候选者 增编: 你改变了问题:) 问:我正在翻阅《K&R》一书,这个问题出现了。如何 最好决定某事物是它自己的变量还是被定义 作为一个符号参数 答:“神奇数字”不好。使用“#定义一

可能重复:

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


假设我们处理的是
const int myNumber=12
,也可以是
#定义我的编号12
在决定是需要创建变量还是使用符号常量时,是否应该遵循经验法则?

如果您硬编码一个类似“2”的常量。。。那么它就是符号参数的候选者

增编:

你改变了问题:)

问:我正在翻阅《K&R》一书,这个问题出现了。如何 最好决定某事物是它自己的变量还是被定义 作为一个符号参数

答:“神奇数字”不好。使用“#定义一些有意义的名称2”而不是“2”

Q:假设我们正在处理常量int myNumber=12,这也可以 定义我的第12条有什么经验法则可以遵循吗 在决定采取哪种方法时


A:如果你使用C++或C语言,那么你应该使用“const”来支持“y*定义”。

真正的问题是<代码> n>代码>应该是声明的代码> const < /Cord>对象还是宏。(问题的标题目前指的是“变量或符号常量”。)

这:

使
myNumber
const
保持不变。
const
关键字意味着不允许修改它应用于的对象,但不能使其保持不变。例如,开关标签必须是常量;你不能写:

switch (n) {
    case myNumber:
    ...
}
因此,如果您需要在需要常量表达式的上下文中使用
myNumber
,上述方法将不起作用

另一方面,宏:

#define MY_NUMBER 12
意味着使用
MY_NUMBER
将被常量
12
替换。宏的一个缺点是它们的作用域没有声明对象的方式;名称
MY_NUMBER
从定义到源文件末尾都可见,这可能会导致冲突。(请注意,宏名称通常用大写字母书写,特别是为了引起注意。)实际上,处理宏的预处理器是另一种附加在C上的语言

对于
int
类型的常量,您可以使用另一个技巧(我认为K&R没有提到这一点):

这将创建一个匿名枚举类型,您实际上不会使用它
myNumber
实际上是
int
类型,而不是枚举类型,您可以使用与使用literal
12
相同的方法来使用它。您甚至可以使用表达式定义其值,只要表达式为常量:

enum { myNumber = 3 * 4 };
<>(C++)有不同的规则。在C++中,<>代码> const int MyNoint=12;确实使<代码> MyNo.<代码>常量表达式,枚举常量属于枚举类型,而不是类型<代码> int >代码>。
enum { myNumber = 12 };
enum { myNumber = 3 * 4 };