我可以使用 new 指定具有宏常量的动态分配数组的元素吗?

Can I specify the elements of a dynamically allocated array with a macro constant by using new?

我知道这没有多大意义,因为在堆上选择分配的目的之一是通过变量对象提供元素数,但是我可以指定动态分配数组的元素数吗宏常量?

喜欢,f.e.:

int* ptr = new int[SIZE];

用宏常量SIZE:

#define SIZE 25

我已经用 g++ 测试了它,编译器通过了它,没有错误或警告。但这并不意味着它没有引起任何问题或者可能是未定义的行为。

Can I specify the elements of a dynamically allocated array with a macro constant in C++?

简答:是的!

原因:使用 #define 指令指定的宏被评估,并且 被评估值 替换,由 预处理器 - 即 实际编译器开始处理代码之前。因此,给定您的(前一个)#define SIZE 25 行,代码:

int* ptr = new int[SIZE];

对于编译器来说,完全等同于

int* ptr = new int[25];

事实上,宏的这种用法很常见 - 例如,在必须为不同平台构建的代码中,SIZE 的值在不同构建之间会有所不同。例如,可以 有条件地 定义 SIZE 如下:

#ifdef PLATFORM25
#define SIZE 25
#else
#define SIZE 50
#endif

或者,甚至可以使用编译器命令行选项定义 SIZE 宏 - 类似于(取决于编译器)的开关:

/DSIZE=25