我正在开发的系统中有很多类,在这些类中,我有一个关于某些东西的“名称”的数组。名称最多30个字符。
最初我只使用了10个字符,但现在我需要增加限制。增加限制需要时间,因为我在很多地方使用这种数组。如果我使用#define NAME_SIZE 30
或类似的东西会更容易,然后我所要做的就是改变一个数而不是大约二十个。
但是我不确定这在C ++中是否属于“合法”的事情。
这将节省我将来的大量时间,这就是我要问的原因。
答案 0 :(得分:5)
是的,它没有任何技术上的错误,除了#define
通常不如const std::size_t MAX_NAME_SIZE = 30;
更好的是拥有动态尺寸,例如使用std::string
。
Scott Meyers有一篇关于使用免费固定大小的系统的有趣专栏,名为The Keyhole Problem
每次软件人为限制时都会出现锁孔问题 你想要看到的东西或你想表达的东西。如果你 想要看到一个图像,但人为地看你的图像查看软件 限制你一次可以看到多少图像,就是这样 锁孔问题。如果要指定特定的密码 长度,但你的软件说它太长了,那就是钥匙孔 问题。如果您想输入您的美国电话号码,请输入您的电话号码 软件拒绝让你以传统方式打断它 在三位数字前缀和四位数之间用短划线表示 交换,这是钥匙孔问题。
除了来自用户的annoynance之外,您还可以打开系统以解决各种安全问题(例如缓冲区溢出漏洞)。
答案 1 :(得分:3)
是的,这是合法的。但通常最好使用实际常量而不是宏:
const int max = 30;
char blah[max];
另一种方法是使用std::string
并且没有硬编码限制(在zero-one-infinity rule之后)。
答案 2 :(得分:0)
是的,这是合法的,但您可能想要使用const int NAME_SIZE = 30;
。这可以安全地放在头文件中。与非const全局变量不同,在不同的转换单元(cpp文件)中使用const变量不会对链接器产生任何问题,因为每个常量对于它定义的文件是本地的。
答案 3 :(得分:0)
另一种选择是typedef
而不是const/define
:
typedef char NAMESTR[30];
NAMESTR name1;
NAMESTR name2;