【问题标题】:Initialize a static const empty array初始化一个静态 const 空数组
【发布时间】:2011-05-04 21:45:42
【问题描述】:

是否可以初始化一个静态的 const 空数组,请看下面的代码,

//CFoo.h
class CFoo
{
 public:
   CFoo();
   ~CFoo();

 public:
    static const int arr[];

};

//CFoo.cpp
const int arr[] = {0,1,2};

CFoo::CFoo(){}
CFoo::~CFoo(){}

编辑:

看来代码是有效的,对于后续问题,为什么我不能 sizeof 静态 const 数组,比如,

sizeof( CFoo::arr );

有什么方法可以调整 CFoo::arr 的大小吗?

谢谢。

【问题讨论】:

    标签: c++


    【解决方案1】:

    是的;您需要限定数组的名称:

    const int CFoo::arr[] = {0,1,2};
    

    CFoo::arr 的类型在定义之前是不完整的,因此您的使用方式受到限制。例如,您不能将其用作sizeof 的参数。如果你完成了声明,那么没有问题:

    struct CFoo {
        static const int arr[3];
    };
    

    但是请注意,这存在可维护性问题,因为大小是在两个不同的地方指定的,如果初始值设定项的值少于数组声明的大小,您可能不会收到错误。

    【讨论】:

    • 谢谢,但是可以使用 sizeof(CFoo::arr) 吗?有什么办法可以 sizeof CFoo::arr 或找到它的大小?
    • 讨厌,但是对于经常更改一长串此类值的特定位置,您可以 #define VALUES {0, 1, 2} \ const int CFoo::arr[] = VALUES; static const int check_cfoo_arr_size[] = VALUES; 和静态断言 sizeof CFoo::arr == sizeof check_cfoo_arr_size... :-(.
    【解决方案2】:

    是的。

    const int CFoo:arr[] = {0,1,2};
    

    【讨论】:

      【解决方案3】:

      sizeof 是在编译时评估的,而不是链接时评估的,所以不 - 您不能在标头中未指定它,但在定义之前对其进行评估。

      【讨论】:

        猜你喜欢
        • 2011-04-18
        • 2013-04-13
        • 2011-10-22
        • 2011-09-26
        • 1970-01-01
        • 1970-01-01
        • 2012-12-15
        • 1970-01-01
        相关资源
        最近更新 更多