C++ 我是否可以使用new指定动态分配的数组的元素以及宏常量?
我知道这没有多大意义,因为在堆上选择分配的目的之一是通过变量对象提供元素数,但是我可以用宏常量指定动态分配数组的元素数吗 比如,f.e.:C++ 我是否可以使用new指定动态分配的数组的元素以及宏常量?,c++,macros,constants,new-operator,dynamic-memory-allocation,C++,Macros,Constants,New Operator,Dynamic Memory Allocation,我知道这没有多大意义,因为在堆上选择分配的目的之一是通过变量对象提供元素数,但是我可以用宏常量指定动态分配数组的元素数吗 比如,f.e.: int* ptr = new int[SIZE]; 宏常量为SIZE: #define SIZE 25 我已经用g++对它进行了测试,编译器在没有错误或警告的情况下通过了测试。但这并不意味着它没有引起任何问题,或者可能是未定义的行为 < L>可以用C++中的宏常量指定动态分配数组的元素吗? 我可以用 C++中的宏常量? 简短回答:是的 原因:使用#
int* ptr = new int[SIZE];
宏常量为SIZE
:
#define SIZE 25
我已经用g++对它进行了测试,编译器在没有错误或警告的情况下通过了测试。但这并不意味着它没有引起任何问题,或者可能是未定义的行为
-
< L>可以用C++中的宏常量指定动态分配数组的元素吗?
#define
指令指定的宏在实际编译器开始处理代码之前,由预处理器计算并替换为计算值。因此,考虑到您的(上一个)#定义大小25
行,代码:
int*ptr=newint[SIZE];
对于编译器而言,将与以下内容完全等效:
int*ptr=newint[25];
事实上,宏的这种用法非常普遍——例如,在必须为不同平台构建的代码中,SIZE
的值在不同的构建中会有所不同。例如,可以有条件地定义SIZE
,如下所示:
#ifdef平台25
#定义尺寸25
#否则
#定义尺寸50
#恩迪夫
或者,甚至可以使用编译器命令行选项定义SIZE
宏,例如开关(取决于编译器):
我可以用
C++中的宏常量?
简短回答:是的
原因:使用#define
指令指定的宏在实际编译器开始处理代码之前,由预处理器计算并替换为计算值。因此,考虑到您的(上一个)#定义大小25
行,代码:
int*ptr=newint[SIZE];
对于编译器而言,将与以下内容完全等效:
int*ptr=newint[25];
事实上,宏的这种用法非常普遍——例如,在必须为不同平台构建的代码中,SIZE
的值在不同的构建中会有所不同。例如,可以有条件地定义SIZE
,如下所示:
#ifdef平台25
#定义尺寸25
#否则
#定义尺寸50
#恩迪夫
或者,甚至可以使用编译器命令行选项定义SIZE
宏,例如开关(取决于编译器):
#定义大小25
为什么要使用宏而不是合适的变量,比如constexpr int SIZE=25代码>?new int[25]
有效,因此new int[SIZE]
无效too@JesperJuhl如果情况合适,为什么我不应该?是什么使得constexp int SIZE=25代码>比使用宏更好?@JesperJuhl一个使用案例是不同目标平台的构建之间的大小值不同(将#define SIZE xx
放在条件预处理器指令中)。@RobertS如果有人决定使用名称SIZE
(例如,局部变量或命名空间范围内的变量/函数)宏将破坏它。这不会发生在constepr int SIZE
中(除非在完全相同的范围内声明新对象).#定义大小25
为什么要使用宏而不是合适的变量,如constepr int SIZE=25;
?new int[25]
是有效的,因此new int[SIZE]
too@JesperJuhl如果情况合适,为什么我不应该?是什么使得constexp int SIZE=25;
比使用宏更好?@JesperJuhl一个使用案例是SIZE
的值在不同目标平台的构建之间变化(将#define SIZE xx
放在条件预处理器指令中)。@RobertS如果有人决定将名称SIZE
用于任何事情(例如,局部变量或命名空间范围内的变量/函数),您的宏将破坏它。这不会发生在constepr int SIZE
(除非在完全相同的范围内声明新对象)。我的想法是,这可能是不允许的,因为在我之前的想法中,动态分配不打算这样做。非常感谢。我的想法是,这可能是不允许的,因为在我之前的想法中,动态分配不打算这样做。非常感谢。
/DSIZE=25