我目前正在开发的系统中有许多类,在这些类中,我有一个关于某物“名称”的数组。名称最多应包含 30 个字符。
最初我只使用了 10 个字符,但现在我需要增加限制。增加限制需要时间,因为我在很多地方都使用这种数组。如果我使用#define NAME_SIZE 30
或类似的东西会更容易,然后我所要做的就是改变一个数字而不是二十左右。
但是我不确定这在 C++ 中是否是“合法”的事情。
这将在未来为我节省大量时间,这就是我问的原因。
我目前正在开发的系统中有许多类,在这些类中,我有一个关于某物“名称”的数组。名称最多应包含 30 个字符。
最初我只使用了 10 个字符,但现在我需要增加限制。增加限制需要时间,因为我在很多地方都使用这种数组。如果我使用#define NAME_SIZE 30
或类似的东西会更容易,然后我所要做的就是改变一个数字而不是二十左右。
但是我不确定这在 C++ 中是否是“合法”的事情。
这将在未来为我节省大量时间,这就是我问的原因。
是的,它在技术上没有任何问题,除了#define
通常不如 aconst std::size_t MAX_NAME_SIZE = 30;
更好的是具有动态大小,例如使用std::string
.
Scott Meyers 有一篇关于使用无偿固定尺寸的系统的有趣专栏,名为The Keyhole Problem
每当软件人为地限制 你想看的东西或你想表达的东西时,就会出现钥匙孔问题。如果您想查看图像,但您的图像查看软件人为地限制了您一次可以看到多少图像,这就是锁孔问题。如果你想指定一个特定长度的密码,但你的软件说它太长,那就是钥匙孔问题。如果您想输入您的美国电话号码,但您的软件拒绝让您以传统方式在三位数前缀和四位数交换之间使用破折号来标点它,这就是钥匙孔问题。
除了来自用户的烦恼之外,您还会向各种安全问题(例如缓冲区溢出漏洞)开放您的系统。
是的,这是合法的。但通常最好使用实际常量而不是宏:
const int max = 30;
char blah[max];
另一种选择是使用 astd::string
并且没有硬编码限制(遵循零一无穷大规则)。
是的,这是合法的,但您可能需要使用const int NAME_SIZE = 30;
. 这可以安全地放在头文件中。与非 const 全局变量不同,在不同的翻译单元(cpp 文件)中拥有 const 变量不会给链接器带来任何问题,因为每个常量对于定义它的文件来说都是本地的。