C++ 常量表达式和数组界限

标签 c++

有人可以解释一下(我可能认为的)以下代码中错误的差异吗?本质上为什么“//OK”没问题而“//error”错误?

(编译器为 i686-apple-darwin9-g++-4.0.1 (GCC) 4.0.1(Apple Inc. build 5490))

#include <cmath>
#include <iosfwd>

template <typename T>
class TT{
   char _c[sizeof(T) + static_cast<size_t>(::ceil(sizeof(T) * 0.001)) + 1];    // error: array bound is not an integer constant
   //char _c[sizeof(T) + static_cast<size_t>(sizeof(T) * 0.001) + 1];  // OK
   T _t;
};

class IS{
   unsigned char* _u;
   double _d;
};

char s[static_cast<size_t>(::ceil(sizeof(TT<IS>) * 10.0))]; // error: array bound is not an integer constant

int main(int argc, char** argv){
  char a[static_cast<size_t>(10.0)];  // OK
  char b[static_cast<size_t>(::ceil(sizeof(double) * 10.0))]; // OK

  TT<int> it;
  char c[static_cast<size_t>(::ceil(sizeof(TT<int>) * 10.0))];    // OK

  TT<IS> is;
  char d[static_cast<size_t>(::ceil(sizeof(TT<IS>) * 10.0))]; // OK

  return 0;
}

顺便说一句,我知道 C++0x:广义常量表达式。

最佳答案

问题出在数组的声明位置。

您可以在文件级别声明一个具有非常量大小的数组,因为编译器需要在编译时知道要分配多少空间,在您的情况下,这需要函数调用。

当您在函数级别执行相同的操作时,您的编译器支持的 C++ 扩展就会启动(标准不允许这样做)——编译器会发出代码来调用函数、计算值并在运行时在堆栈上分配数组.

关于C++ 常量表达式和数组界限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1304040/

相关文章:

c++ - 类工厂混合

c++ - 如何查找 float 是否等于 C++ 中的整数值

c++ - 静态数组上的 memset

c++ - 我可以用 AND 替换 if 语句吗?

c++ - 获取 Direct3D 初始化的 HWND

c++ - 与 iOS 项目上的 C++ 库链接失败

c++在新线程中创建窗口

c++ - 如何处理 void decltype();

c++ - 如何在 Linux 上使用 C++ 将文件属性 (1644) 设置为特定文件

c++ - 为什么 Qt 会改变 sscanf() 的行为?