假设我在全局/命名空间范围(任何块之外)的C++程序中设置了以下内容:
情况1:
a.cpp
extern const int i=5;b.cpp
extern const int i;在我看来,有两种方式可以让编译器看到这一点。一个是I的真正声明是在b.cpp中,而a.cpp只有一个前向声明和初始化。(因为我们知道,对于特定的extern,声明时不需要初始化)编译器可以生成的其他可能的可执行文件将包含带有初始化的真正声明的a.cpp,而b.cpp中的语句被看作是向前声明,只需要在那里帮助编译器知道我是什么。
编译器如何决定哪个文件负责实际声明,从而决定与i关联的内存分配?如果使用的是具有有趣构造函数的类型,而不是int,这可能会产生表面上可观察的效果。
这个问题的答案是如何变化的,如果有的话,因为:
情况2:
a.cpp
extern const int i;
extern const int i=5;b.cpp
extern const int i;发布于 2017-01-27 19:47:54
初始化器的存在会立即将声明转换为定义(除了少数例外,在我们的上下文中不相关)。这意味着
extern const int i = 5;是i的定义。它定义i并给它外部链接,即创建实际的i并使其对其他翻译单元可见(“导出”它)。
同时,
extern const int i;如果是i,则为非定义声明。它基本上说i是在其他地方定义的(“导入”它)。
当您出于某种原因需要C++中的全局C++对象时,extern的正确显式应用变得至关重要,因为在C++中const对象默认具有内部链接。
请记住,为了使const int对象符合积分常量表达式( ICE )的条件,必须可以看到带有ICE初始化器的const int对象的声明。
https://stackoverflow.com/questions/41901525
复制相似问题