【问题标题】:Is it legal to use #define in order to define the size of a static array?使用#define 来定义静态数组的大小是否合法?
【发布时间】:2012-08-06 13:15:15
【问题描述】:

我目前正在开发的系统中有许多类,在这些类中我有一个关于某物“名称”的数组。名称不得超过 30 个字符。

最初我只使用了 10 个字符,但现在我需要增加限制。增加限制需要时间,因为我在很多地方都使用这种数组。如果我使用#define NAME_SIZE 30 或类似的东西会更容易,然后我所要做的就是更改一个数字而不是大约二十个。

但是我不确定这在 C++ 中是否“合法”。

这会在未来为我节省大量时间,这就是我问的原因。

【问题讨论】:

  • 如果我理解正确,您的代码中有很多“幻数”实例。这比使用#define 要糟糕得多,因为你所说的确切原因!

标签: c++ dynamic c-preprocessor static-array


【解决方案1】:

是的,它在技术上没有任何问题,除了 #define 通常不如 const std::size_t MAX_NAME_SIZE = 30; 更好的是具有动态大小,例如使用std::string

Scott Meyers 有一篇关于使用无偿固定尺寸的系统的有趣专栏,名为 The Keyhole Problem

每次软件人为限制时都会出现钥匙孔问题 你想看到的东西或你想表达的东西。如果你 想看图像,但您的图像查看软件人为 限制您一次可以看到多少图像,这就是 钥匙孔问题。如果要指定特定密码 长度,但是你的软件说它太长了,那是钥匙孔 问题。如果您想输入您的美国电话号码,但您的 软件拒绝让您以常规方式标点它 三位数前缀和四位数之间有破折号 交换,这就是钥匙孔问题。

除了用户的烦恼之外,您还会让系统面临各种安全问题(例如缓冲区溢出漏洞)。

【讨论】:

    【解决方案2】:

    是的,这是合法的。但通常最好使用实际常量而不是宏:

    const int max = 30;
    char blah[max];
    

    另一种选择是使用std::string 并且没有硬编码限制(在zero-one-infinity rule 之后)。

    【讨论】:

    • 我相信size_t 会是更适合常量的类型。
    【解决方案3】:

    是的,这是合法的,但您可能想要使用const int NAME_SIZE = 30;。这可以安全地放在头文件中。与非 const 全局变量不同,将 const 变量放在不同的翻译单元(cpp 文件)中不会对链接器造成任何问题,因为每个常量对于定义它的文件来说都是本地的。

    【讨论】:

      猜你喜欢
      • 2015-07-06
      • 2011-02-12
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      相关资源
      最近更新 更多