【问题标题】:Can I specify the elements of a dynamically allocated array with a macro constant by using new?我可以使用 new 指定具有宏常量的动态分配数组的元素吗?
【发布时间】:2020-05-12 04:08:35
【问题描述】:

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

喜欢,例如:

int* ptr = new int[SIZE];

SIZE的宏常量:

#define SIZE 25

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

  • 能否在 C++ 中使用宏常量指定动态分配数组的元素?

【问题讨论】:

  • #define SIZE 25 为什么你会使用宏而不是适当的变量,比如constexpr int SIZE = 25;
  • new int [25] 有效,因此new int [SIZE] 也有效
  • @JesperJuhl 如果情况合适,为什么我不应该?是什么让constexp int SIZE = 25; 比使用宏更好?
  • @JesperJuhl 一个用例是SIZE 的值在不同目标平台的构建之间有所不同(将#define SIZE xx 放置在条件预处理器指令中)。
  • @RobertS-ReinstateMonica 如果有人决定将名称 SIZE 用于任何事物(例如,局部变量或命名空间范围内的变量/函数),您的宏将破坏它。 constexpr int SIZE 不会发生这种情况(除非新对象在完全相同的范围内声明)。

标签: c++ macros constants new-operator dynamic-memory-allocation


【解决方案1】:

我可以指定动态分配数组的元素吗? 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

【讨论】:

  • 我的想法是它可能是不允许的,因为动态分配 - 在我之前的想法中 - 不适合这样做。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
相关资源
最近更新 更多