`#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);
}
好吧,这个问题并不像听起来那么愚蠢。
我正在使用 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);
}