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

C++ 使用#define来定义静态数组的大小是否合法?,c++,dynamic,c-preprocessor,static-array,C++,Dynamic,C Preprocessor,Static Array,我目前正在开发的系统中有很多类,在这些类中,我有一个关于某个事物“名称”的数组。名称最多应为30个字符 最初我只使用了10个字符,但现在我需要增加限制。但是,增加限制需要时间,因为我在许多地方使用这种数组。如果我使用#define NAME_SIZE 30或类似的东西,那么我所要做的就是更改一个数字,而不是大约二十个 但是我不确定C++中是否有“合法”的事情。 这将在将来为我节省大量时间,这就是我为什么要问的原因。是的,它在技术上没有什么问题,只是\define通常不如const std::si

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

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

但是我不确定C++中是否有“合法”的事情。


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

是的,它在技术上没有什么问题,只是
\define
通常不如
const std::size\t MAX\u NAME\u size=30
最好使用动态大小,例如使用
std::string

Scott Meyers有一个有趣的专栏,介绍使用免费固定大小的系统,名为

每次软件人为限制 你想看的东西或你想表达的东西。如果你 想看一个图像,但你的图像查看软件人为 限制一次可以看到多少图像,这是 钥匙孔问题。如果要指定特定密码,请执行以下操作: 长度,但你的软件说它太长了,那是钥匙孔 问题如果您想输入您的美国电话号码,但 软件拒绝让你用传统的方式给它加标点符号 在三位数前缀和四位数之间加一个破折号 交换,这就是钥匙孔的问题


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

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

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

另一种选择是使用
std::string
并且没有硬编码限制(在后面)。

是的,这是合法的,但您可能希望使用
常量int NAME\u SIZE=30。这可以安全地放在头文件中。与非常量全局变量不同,将常量变量放在不同的转换单元(cpp文件)中不会给链接器带来任何问题,因为每个常量都是它在其中定义的文件的局部变量。

我认为
size\u t
将是该常量更合适的类型。如果我理解正确,您有许多“幻数”的实例在你的代码中。这比使用
#define
要糟糕得多,原因正是您所说的!