`#define` C++ 源代码中的一个非常大的数字

`#define` a very large number in c++ source code

好吧,这个问题并不像听起来那么愚蠢。

我正在使用 C++11 <array> 并且想要声明这样的数组:

array<int, MAX_ARR_SIZE> myArr;

MAX_ARR_SIZE 将在头文件中定义,并且可能非常大,即 10^13。目前我像学龄前儿童一样打字

 #define MAX_ARR_SIZE 1000000000000000

如果没有办法,我可以忍受。我不能在这里使用 pow(10, 13) 因为它不能在编译时求值;数组初始化将失败。我不知道有什么 shorthand 可以输入这个。

对常量使用 #define 比 C++ 更像是 C 的一种方式。

您可以这样定义常量:

const size_t MAX_ARR_SIZE(1e15); 

您可以使用:

#define MAX_ARR_SIZE 1e15

1e15 非常大,可能不会分配。

#define MAX_ARRAY_SIZE (1000ull * 1000 * 1000 * 1000 * 1000)

如果使用 const 而不是 #define,实际上可以在 C++11 的编译时计算 pow(10, 15) 和类似表达式。只要确保你选择了足够大的基元。

在这种情况下,最好使用 const size_t 而不是 #define


我想补充一点,自 C++14 起,在编写整数文字时,您可以添加可选的单引号作为分隔符。

1'000'000'000'000'000

这样看起来更清楚了。

你可以定义一个constexpr函数:

constexpr size_t MAX_ARR_SIZE()
{
    return pow(10, 15); 
}

这样您就可以在编译时进行更复杂的计算。

然后将其用作array<int, MAX_ARR_SIZE()> myArr;它将在编译时评估。

同样如前所述,您可能无法在堆栈上分配该大小。

编辑:

我这里有一个错误,因为 pow 本身不是 constexpr 你不能使用它,但它是可以解决的,例如使用这里讨论的 ipow:c++11 fast constexpr integer powers

这里是函数引用:

constexpr int64_t ipow(int64_t base, int exp, int64_t result = 1) {
  return exp < 1 ? result : ipow(base*base, exp/2, (exp % 2) ? result*base : result);
}

只需将 MAX_ARR_SIZE() 更改为:

constexpr size_t MAX_ARR_SIZE()
{
    return ipow(10, 15); 
}