【问题标题】:C++ Constant Expression and Array BoundsC++ 常量表达式和数组边界
【发布时间】:2009-08-20 05:00:11
【问题描述】:

有人可以解释(我可能认为)以下代码中的错误差异吗?本质上为什么“//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++


    【解决方案1】:

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

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

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

    【讨论】:

    • 这就是我想要验证的。在数组声明中具有 ceil() (或任何其他函数)的函数中,不会破坏任何语言语义/规则。但是,在一个数组大小取决于函数的类中,会破坏 sizeof()。在这种情况下 sizeof(TT) 在编译时不可用。非常感谢!感谢您的时间!
    • 很好的答案。顺便说一句,使用 Microsoft 的 Visual C++ 编译器,您也无法在函数级别执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2011-04-14
    相关资源
    最近更新 更多