是否可以转发声明静态数组

19 c++

我需要将静态数组放入.cpp文件中.此数组仅用于此.cpp,因此我想将其声明为静态.数组定义非常大,所以我自然要转发声明它.

static int bigIntArray[5000];

/* other code using bitIntArray */

static int bigIntArray[5000] = {
  0x00, 0x9900, 0xffee,
  ...
};
Run Code Online (Sandbox Code Playgroud)

VC 9.0给出错误:错误C2086:'int bigIntArray [5000]':重新定义

如果我将'static'改为'extern',问题就会消失,但我不喜欢这个解决方案.

为什么我不能转发声明一个静态变量?这是C++标准所要求的吗?

D. *_* A. 28

冒回答稍微不同的问题的风险(Charles Bailey很好地回答了你的问题),你可能想要使用带有extern的匿名命名空间.这可以防止其他翻译单元访问该阵列.

namespace {
    extern int bigIntArray[5000];
}

// Code that uses bigIntArray

namespace {
    int bigIntArray[5000] = { ... };
}
Run Code Online (Sandbox Code Playgroud)

这可能符合您的需求.

  • @DyP然而,即使是`static`对象也是如此 - 一旦指针松动,任何TU都可以访问对象...... (3认同)
  • “这可以防止其他翻译单元访问数组。” 您不能在其他 TU 中通过名称*“bigIntArray”来引用数组。显然,如果您以某种方式获得指向它的指针,就可以访问它。 (2认同)

CB *_*ley 25

如果使用extern关键字并且未指定初始化程序,则只能在C++中转发声明对象.声明对象的任何其他尝试也将是一个定义.这意味着前向声明的对象将具有外部链接.无法转发声明static对象,即具有内部链接的对象.

这与C不同,其中没有初始化程序的任何声明都是暂定定义,可以提供后续定义,但它们必须都指定相同的链接.

  • 这似乎是正确的答案.添加一些规范引用会很好. (3认同)