嗯,问题并不像听起来那么愚蠢。
我正在使用C ++ 11 <array>
并希望声明一个这样的数组:
array<int, MAX_ARR_SIZE> myArr;
MAX_ARR_SIZE
将在头文件中定义,并且可能非常大,即10 ^ 13。目前我正在打字,就像一个学龄前的孩子
#define MAX_ARR_SIZE 1000000000000000
如果别无选择,我可以忍受它。我不能在这里使用pow(10, 13)
,因为它无法在编译时进行评估;数组初始化将失败。我不知道有任何类型的简写。
答案 0 :(得分:9)
对于常量使用 #define 更像是C语言而不是C ++。
您可以通过以下方式定义常量:
const size_t MAX_ARR_SIZE(1e15);
答案 1 :(得分:7)
在这种情况下,首选使用const size_t
代替#define
。
我想补充一点,因为C ++ 14,在编写整数文字时,你可以添加可选的单引号作为分隔符。
1'000'000'000'000'000
这看起来更清楚。
答案 2 :(得分:2)
您可以定义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);
}
答案 3 :(得分:1)
#define MAX_ARRAY_SIZE (1000ull * 1000 * 1000 * 1000 * 1000)
答案 4 :(得分:0)
您可以使用:
#define MAX_ARR_SIZE 1e15
1e15
非常庞大,可能不会被分配。
答案 5 :(得分:0)
如果你使用const而不是#define,你实际上可以在编译时在C ++ 11中评估pow(10,15)和类似的表达式。只要确保选择足够大的原语。