我是否应该使用常量而不是字符串,即使字符串只使用过一次?

时间:2010-11-20 17:55:27

标签: string language-agnostic 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 */
}

这些字符串"height""width"只能用在这段代码中。不过,我想知道使用像

这样的定义字符串常量是否更好
#define KEYWORD_WIDTH ("width")

而不是上面代码中的那些文字。

你会做什么?

6 个答案:

答案 0 :(得分:10)

在不提取常量的情况下启动。然后,如果您以后出于某种原因需要它,您的编辑可能会为您执行此操作。

虽然如果您认为它会提高代码的可读性,那么您可以使用常量。如果您可以通过这样做添加更多语义含义,请执行此操作:

BROWSER_WIDTH = "width"
CONNECTION_POOL_MAX_SIZE = "max_size"

答案 1 :(得分:5)

将常量放在一个地方有助于特别是如果将来需要更改常量 - 即在本地化的情况下。

如果字符串常量特定于解决方案(即解析某种具有良好建立关键字的配置文件),那么我会说引入const不会做任何事情 - 除了保持编码风格一致。 :)

Ofc,如果你使用两次相同的字符串常量,那么常量会给你一个很大的好处:编译器会在你用常量名称输入错误时警告你,但是如果你在重复的字面上写错字。

答案 2 :(得分:2)

对字符串使用常量的好处是,即使它们仅使用一次或两次,编译器也可以检查您是否正确拼写了标识符名称,如果您只使用字符串文字,则无法执行此操作 - - 所以一旦你的实际字符串本身正确,你就更有可能在编译时获取某些类型的拼写错误。这通常是有帮助的(出于显而易见的原因) - 尽管有时对于接下来遇到代码的人来说有点烦人,不得不经常找到每个常量的定义以查看它实际引用的字符序列。

我对C(实际上是C ++)的一个建议是使用静态const char数组来保存字符串,例如:

static const char KEYWORD_WIDTH[]="width";

这使得在调试器中更容易看到,并且您可以保证只获得每个字符串的一个副本。

答案 3 :(得分:1)

我使用const。*

即使只使用一次。

我不会使用#define。

*除非在极其狭窄的情况下,一个糟糕的编译器在极其受限的内存环境中生成额外的字节

答案 4 :(得分:1)

使用具有有意义名称的常量是一个好习惯,即使它们在代码中使用过一次也是如此。如果您多次使用它们,则必须定义常量。

答案 5 :(得分:1)

使用常量符号而不是幻数/字符串的一个优点是,您可以更精确地表达值的语义。例如。文本中的字符串标记可以是“wdh”。例如,它的意思是“宽度”或“象征意味着汽车的宽度”并不明显。使用常数可以更好地表达它:

const chat * WIDTH_OF_CAR_PARSING_TOKEN = "wdh";

这只是一个想法。