extern变量和数组声明问题c ++

Mik*_*ail 6 c++ arrays const global-variables extern

我有一个外部变量和一个数组声明的问题.如何使用不在可声明文件中的全局变量声明数组.

file1.cpp

const int size = 10;
Run Code Online (Sandbox Code Playgroud)

mainfile.cpp

extern const int size;

void main()
{
  int mas[size];
}
Run Code Online (Sandbox Code Playgroud)
int mas[size];
Run Code Online (Sandbox Code Playgroud)

这条线有一个问题.请猜猜想?

Mik*_*our 6

你不能.数组大小必须是常量表达式; 如果它是变量,则该变量必须const在同一个转换单元中初始化,以便其值可用作常量.

如果要在多个翻译单元之间共享值,请在标题中定义它并包含它.


Vla*_*cow 3

首先,常量具有内部联系。因此这些声明

\n\n
file1.cpp\nconst int size = 10;\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
mainfile.cpp\nextern const int size;\n
Run Code Online (Sandbox Code Playgroud)\n\n

指的是不同的实体。

\n\n

file1.cpp 中声明的常量在其相应的编译单元之外不可见。

\n\n

根据C++标准(3.5程序和链接)

\n\n
\n

3 具有命名空间范围 (3.3.6) 的名称具有内部链接,如果它是\n

\n\n

\xe2\x80\x94显式声明为 const 或 \n constexpr 的非易失性变量且既未显式声明为 extern 也未先前声明为具有外部链接的或者

\n
\n\n

在 mainfile 中,未指定 size 的值,因此编译器将发出 for 语句错误

\n\n
int mas[size];\n
Run Code Online (Sandbox Code Playgroud)\n\n

因为数组的大小应该是编译时常量表达式。

\n\n

最简单的解决方案是放置常量定义

\n\n
const int size = 10;\n
Run Code Online (Sandbox Code Playgroud)\n\n

在一些公共头文件中,该文件将包含在每个翻译单元中,其中存在对常量的引用。

\n