为某物附加一个名称会创建一个身份。给定定义
const double Moe = 2.0;
const double Joe = 2.0;
...
double Larry = Moe;
double Harry = Moe;
double Garry = Joe;
Moe 和 Joe 的符号使用表明 Larry 和 Harry 的默认值彼此相关,而 Garry 的默认值则没有。是否为特定常量定义名称的决定不应取决于该常量的值,而是取决于它是否会非巧合地出现在代码中的多个位置。如果一个人正在与需要向其发送特定字节值以触发重置的远程设备通信,我会考虑:
void ResetDevice()
{
// The 0xF9 command is described in the REMOTE_RESET section of the
// Frobnitz 9000 manual
transmitByte(0xF9);
}
... elsewhere
myDevice.ResetDevice();
...
otherDevice.ResetDevice();
在许多情况下优于
// The 0xF9 command is described in the REMOTE_RESET section of the
// Frobnitz 9000 manual
const int FrobnitzResetCode = 0xF9;
... elsewhere
myDevice.transmitByte(FrobnitzResetCode );
...
otherDevice.transmitByte(FrobnitzResetCode );
值 0xF9 在重置 Frobnitz 9000 设备的上下文之外没有实际意义。除非出于某种原因,外部代码应该更喜欢自己发送必要的值而不是调用 ResetDevice 方法,否则该常量应该对方法之外的任何代码没有任何价值。虽然也许可以使用
void ResetDevice()
{
// The 0xF9 command is described in the REMOTE_RESET section of the
// Frobnitz 9000 manual
int FrobnitzResetCode = 0xF9;
transmitByte(FrobnitzResetCode);
}
在如此狭隘的背景下为事物定义名称确实没有多大意义。
关于 0 和 1 等值的唯一“特殊”之处在于,它们的使用频率明显高于其他常量,例如23 在它们在使用它们的上下文之外没有特定于域的身份的情况下。如果使用的函数要求第一个参数指示附加参数的数量(在 C 中有些常见),最好这样说:
output_multiple_strings(4, "Bob", Joe, Larry, "Fred"); // There are 4 arguments
...
output_multiple_strings(4, "George", Fred, "James", Lucy); // There are 4 arguments
比
#define NUMBER_OF_STRINGS 4 // 有 4 个参数
output_multiple_strings(NUMBER_OF_STRINGS, "Bob", Joe, Larry, "Fred");
...
output_multiple_strings(NUMBER_OF_STRINGS, "George", Fred, "James", Lucy);
后一个语句意味着传递给第一个方法的值和传递给第二个方法的值之间的联系比传递给第一个方法的值和该方法调用中的任何其他内容之间存在的联系更强。除其他事项外,如果需要更改其中一个调用以传递 5 个参数,则在第二个代码示例中不清楚应该更改什么以允许这样做。相比之下,在前一个样本中,常数“4”应改为“5”。