C++ 使用#define来定义静态数组的大小是否合法?
我目前正在开发的系统中有很多类,在这些类中,我有一个关于某个事物“名称”的数组。名称最多应为30个字符 最初我只使用了10个字符,但现在我需要增加限制。但是,增加限制需要时间,因为我在许多地方使用这种数组。如果我使用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
#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
要糟糕得多,原因正是您所说的!