使用#define来定义静态数组的大小是否合法?

时间:2012-08-09 10:21:53

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

我正在开发的系统中有很多类,在这些类中,我有一个关于某些东西的“名称”的数组。名称最多30个字符。

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

但是我不确定这在C ++中是否属于“合法”的事情。

这将节省我将来的大量时间,这就是我要问的原因。

4 个答案:

答案 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;