【问题标题】:Should I use constants instead of strings even if the strings are only ever used once?即使字符串只使用过一次,我是否应该使用常量而不是字符串?
【发布时间】:2011-05-13 03:47:46
【问题描述】:

我有一段代码可以解析一些晦涩的文本文件。
该文本文件可以包含各种关键字。在某些时候,有一些冗长的部分是这样的:

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")

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

你会怎么做?

【问题讨论】:

标签: string language-agnostic coding-style constants


【解决方案1】:

我会使用 const.*

即使只使用一次。

我不会使用#define。

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

【讨论】:

  • 你为什么要这样做?文字字符串无论如何都是 const 的,不是吗?为永远不会改变的东西声明一个变量似乎是在浪费内存。
  • @Basti:在 C/C++ 中,任何有价值的编译器都会生成相同的代码。无论如何,其他语言“缺乏”预处理器。与往常一样,如果您非常关心内存使用,那么其他地方可能会有更大的优化机会 - 无需浪费时间考虑这些小事。
  • 抱歉,我最近在 DSP 上做了很多工作。并且 DSP 具有相当严格的内存限制和通常糟糕的编译器(我曾经在缺少工作的 new[]... 的 DSP 上使用 C++ 运行时)。不过,您可能是对的,这不是一个关键问题。
  • 至于“为什么”:您可能会认为“这仅用于这一点,因此将其保留为文字是可以的”。如果你是对的,并且你永远不会在其他地方使用相同的文字的假设被证明是正确的,那么它实际上并不重要。然而。在实践中,我发现这绝对不是真的,我发现只制作 const 是最佳实践,因为最终我会在其他地方实际使用它,即使我不这样做,大多数编译器也不会t 严重影响已编译的代码,如其他地方所述。
【解决方案2】:

开始时不提取常量。稍后,如果您以后出于某种原因需要它,您的编辑器可能会为您执行此操作。

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

BROWSER_WIDTH = "width"
CONNECTION_POOL_MAX_SIZE = "max_size"

【讨论】:

  • +1 用于添加含义。像 STRING_ONE 这样的 const 只是(日常)WTF。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    将常量放在一个位置很有帮助,尤其是在将来需要更改常量时 - 即在本地化的情况下。

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

    Ofc,如果你两次使用同一个字符串常量,这个常量会给你一个很大的好处:当你在常量名中输入错误时编译器会警告你,但如果你在重复的文字中打错字。

    【讨论】:

      【解决方案5】:

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

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

      static const char KEYWORD_WIDTH[]="width";
      

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

      【讨论】:

      • 但是由于字符串只使用过一次,编译器无法帮助我进行拼写检查...
      • 哦,对了……我认为我的字面意思是:) 可能会选择“不要强迫下一个人跳过代码”的案例!
      • "你保证只得到每个字符串的一个副本" ...每个翻译单元。
      【解决方案6】:

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

      const chat * WIDTH_OF_CAR_PARSING_TOKEN = "wdh";
      

      这只是一个想法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-12
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 2019-01-28
        • 2013-09-19
        相关资源
        最近更新 更多