c++ - const int 定义的变量是在编译时确定的吗?

标签 c++

我只是想知道像const int N=10 这样的语句是否会在编译时执行。我问的原因是因为下面的代码可以工作。

int main()
{
  const int N=10;
  int a[N]={};
  return 0;
}    

但是这个不会。

int main()
{
  int N=10;
  int a[N]={};
  return 0;
}

最佳答案

编译器必须生成代码“就好像”表达式是在 编译时间,但 const 本身不足以满足此要求。在 顺序用作数组的维度,例如表达式 N 必须是“常数积分表达式”。 const int 是 仅当用常量初始化时才为常量积分表达式 整数表达式,并且初始化对编译器可见。 (比如 extern int const N;,不能用在 常数积分表达式。​​)

然而,要成为常量积分表达式,变量必须是 常量;在你的第二个例子中,编译器的行为和 结果程序必须“好像”表达式仅在 运行时(这意味着它不能用作 大批)。实际上,至少通过优化,编译器可能 将在编译时评估 N,但它仍然必须假装它 不能,拒绝编译代码。

关于c++ - const int 定义的变量是在编译时确定的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27048025/

相关文章:

c++ - std::discrete_distribution 的意外行为

c++ - 如何设计:矩阵的线性代数例程

c++ - 使用 cppyy 连接 C++ 和 pypy 时遇到错误

c++ - 如何使用boost::unit_test 编写脚本来执行自动测试?

c++ - 将 numpy 数组与 boost.python : pyublas or boost. numpy 交换?

c++ - Cmake 奇怪的错误 : Syntax Error Unexpected Token ('

c++ - 使用带有 C MPI 函数的 boost 序列化

使用 cout 和 reverse_iterator 的 C++ 奇怪输出

c++ - CPP 检查器 : memsetValueOutOfRange

c++ - 联盟成员具有用户定义的构造函数