【问题标题】:static const array initialized in the .cpp file在 .cpp 文件中初始化的静态常量数组
【发布时间】:2020-09-10 07:30:03
【问题描述】:

我对旧 C++ 代码的一部分有疑问。 在类 myClass 的头文件中有一个静态数组成员定义如下:

static const int myArray[];

在.cpp文件中初始化如下:

const int myClass::myArray[]={2,4,5,7,9,11,13};

允许吗?

我暂时不在乎它是否不好,我只是想知道它是否会给我带来奇怪的问题..

【问题讨论】:

  • 是的,完全没问题
  • 最好使用const std::array<int,FIXED_SIZE> myArray;const std::vecto<int> myArray;。这将为您在以后调试可能出现的问题时节省大量时间。 T代码的现有部分不会受到太大影响,在最好的情况下您不需要更改任何内容。只是说。`
  • 允许吗?你害怕什么?空括号?在.h 文件中,它只是一个声明。因此,其他翻译单元不需要知道大小。在.cpp 文件中,大小由初始化决定。请注意:static 成员变量不会影响班级规模。因此,对于该类的实例,不需要static 成员的实际大小。 .cpp 文件中的初始化是必要的。否则,链接器会抱怨。 (较新的标准添加了static inline,但您标记了c++98,这仍然是遥不可及的未来。)

标签: c++ c++98


【解决方案1】:

允许吗?

重复@bolovs 评论:

是的,没关系

我不完全确定 OP 特别担心什么。 所以,我列出了 OP 可能已经看到的可疑问题。

1. .h 中的声明与.cpp 中的定义

这是在 C++ 中定义 static 成员变量的常用(也是唯一)方法 - 在 C++17 中发明 static inline 成员变量之前。

由于标头可能包含在多个翻译单元(又名.cpp 文件)中,因此标头中的定义将由编译器多次处理,因此违反One Definition Rule 并通常导致链接器错误。

2。 .h中带空括号的声明

对于声明,数组的实际大小不是必需的。

请注意:static 成员变量不会影响类的大小。 因此,当类用于其他翻译单元时,数组的未知大小不会妨碍编译器确定类的正确大小。

3。 .cpp中带空括号的定义@

这是一个从 C 继承的古老特性:当可以从初始值设定项确定时,可以定义数组而忽略大小。

这对于消除代码中的冗余很有用。

(否则,可能会导致像 const char text[10] = "Hello world."; 这样的烦人错误,因为作者无法正确计算 "Hello world." 需要 13 个元素而不是 10 个元素。)

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 2016-10-28
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2011-05-07
    • 1970-01-01
    相关资源
    最近更新 更多