繁体   English   中英

`#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) ,因为它无法在编译时进行评估; 数组初始化将失败。 我不知道有任何类型的简写。

对于常量使用#define比C ++更像是一种C语言。

您可以通过以下方式定义常量:

const size_t MAX_ARR_SIZE(1e15); 

在这种情况下,首选使用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); 
}
#define MAX_ARRAY_SIZE (1000ull * 1000 * 1000 * 1000 * 1000)

您可以使用 :

#define MAX_ARR_SIZE 1e15

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

如果你使用const而不是#define,你实际上可以在编译时在C ++ 11中评估pow(10,15)和类似的表达式。 只要确保你选择一个足够大的原语。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM