gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:49:26 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com