bas*_*ibe 9 language-agnostic string coding-style constants
我有一段代码可以解析一些不起眼的文本文件.
此文本文件可以包含各种关键字.在某些时候,有一些冗长的部分,如下所示:
void loadKeywords() {
tmpString = getValueForKeyword("width");
if (tmpString != NULL) {
/* do something for several lines */
}
tmpString = getValueForKeyword("height");
if (tmpString != NULL) {
/* do something for several lines */
}
/* and so on a few dozen times */
}
Run Code Online (Sandbox Code Playgroud)
这些字符串"height"和"width"只曾经在这个非常的代码使用.不过,我想知道使用定义的字符串常量是否更好
#define KEYWORD_WIDTH ("width")
Run Code Online (Sandbox Code Playgroud)
而不是上面代码中的那些文字.
你会怎么做?
Knu*_*ubo 12
开始时不提取常量.然后,如果您以后出于某种原因需要它,您的编辑可能会为您执行此操作.
虽然如果您认为它会提高代码的可读性,那么您可以使用常量.如果您可以通过这样做添加更多语义含义,请执行此操作:
BROWSER_WIDTH = "width"
CONNECTION_POOL_MAX_SIZE = "max_size"
Run Code Online (Sandbox Code Playgroud)
使用常量符号而不是幻数/字符串的优点之一是可以更精确地表达值的语义。例如,文本中的字符串标记可以是“wdh”。例如,它的意思是“宽度”,或者“表示汽车宽度的令牌”,这并不明显。使用常量可以更好地表达它:
const chat * WIDTH_OF_CAR_PARSING_TOKEN = "wdh";
Run Code Online (Sandbox Code Playgroud)
这只是一个想法。
小智 7
使用字符串常量的优点是,即使它们只使用一两次,编译器也可以检查您是否正确拼写了标识符名称,而如果您只使用字符串文字,则编译器无法做到这一点 - 所以一旦如果您的实际字符串本身是正确的,那么您更有可能在编译时发现某些类型的拼写错误。这通常很有帮助(出于明显的原因)——尽管有时对于接下来遇到您的代码的人来说可能有点烦人,必须定期查找每个常量的定义以查看它实际引用的字符序列。
我对 C(实际上是 C++)的一项建议是使用 static const char 数组来保存字符串,例如:
static const char KEYWORD_WIDTH[]="width";
Run Code Online (Sandbox Code Playgroud)
这使得在调试器中更容易查看,并且保证您只获得每个字符串的一份副本。
将常量放在一个地方有助于特别是如果将来需要更改常数 - 即在本地化的情况下.
如果字符串常量特定于解决方案(即解析某种具有良好建立关键字的配置文件),那么我会说引入const不会做任何事情 - 除了保持编码风格一致.:)
Ofc,如果你使用相同的字符串常量两次,常量会给你一个很大的好处:编译器会在你用常量名称输入拼写错误时发出警告,但是如果你在重复的字面值中输入拼写错误则不会.