首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是声明,也是前宣言。

这是声明,也是前宣言。
EN

Stack Overflow用户
提问于 2017-01-27 19:24:02
回答 1查看 1.3K关注 0票数 1

假设我在全局/命名空间范围(任何块之外)的C++程序中设置了以下内容:

情况1:

a.cpp

代码语言:javascript
复制
extern const int i=5;

b.cpp

代码语言:javascript
复制
extern const int i;

在我看来,有两种方式可以让编译器看到这一点。一个是I的真正声明是在b.cpp中,而a.cpp只有一个前向声明和初始化。(因为我们知道,对于特定的extern,声明时不需要初始化)编译器可以生成的其他可能的可执行文件将包含带有初始化的真正声明的a.cpp,而b.cpp中的语句被看作是向前声明,只需要在那里帮助编译器知道我是什么。

编译器如何决定哪个文件负责实际声明,从而决定与i关联的内存分配?如果使用的是具有有趣构造函数的类型,而不是int,这可能会产生表面上可观察的效果。

这个问题的答案是如何变化的,如果有的话,因为:

情况2:

a.cpp

代码语言:javascript
复制
extern const int i;
extern const int i=5;

b.cpp

代码语言:javascript
复制
extern const int i;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-27 19:47:54

初始化器的存在会立即将声明转换为定义(除了少数例外,在我们的上下文中不相关)。这意味着

代码语言:javascript
复制
extern const int i = 5;

i的定义。它定义i并给它外部链接,即创建实际的i并使其对其他翻译单元可见(“导出”它)。

同时,

代码语言:javascript
复制
extern const int i;

如果是i,则为非定义声明。它基本上说i是在其他地方定义的(“导入”它)。

当您出于某种原因需要C++中的全局C++对象时,extern的正确显式应用变得至关重要,因为在C++中const对象默认具有内部链接。

请记住,为了使const int对象符合积分常量表达式( ICE )的条件,必须可以看到带有ICE初始化器的const int对象的声明。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41901525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档