假设我在C ++程序中具有以下设置:在全局/命名空间范围内(在任何块之外):
情况1:
a.cpp
extern const int i=5;
b.cpp
extern const int i;
在我看来,有两种方法可以让编译器看到这一点。一个是i的真正声明在b.cpp中,而a.cpp只有一个前向声明和初始化。 (因为我们知道对于特定的extern consts,不需要声明时的初始化)编译器可以生成的另一个可能的可执行文件将包含一个包含真实声明的a.cpp,初始化,并且可以看到b.cpp中的语句作为前瞻性声明,只需要在那里协助编制者知道我是什么。
编译器如何确定哪个文件负责实际声明,因此与i相关的内存分配?如果使用具有有趣构造函数的类型而不是int,则可能具有向外可观察的效果。
如果有的话,这个问题的答案如何改变:
情况2:a.cpp
extern const int i;
extern const int i=5;
b.cpp
extern const int i;
答案 0 :(得分:2)
初始化程序的存在立即将声明转换为定义(少数例外,在我们的上下文中无关紧要)。这意味着
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
viewController.navigationItem.title = "Some title"
}
是extern const int i = 5;
的定义。它定义i
并给它外部链接,即创建实际的i
并使其对其他翻译单元可见(“导出”它。)
同时,
i
如果extern const int i;
,是非定义声明。它基本上说i
在其他地方定义(“导入”它)。
当您出于某种原因需要C ++中的全局i
对象时,const
的正确显式应用变得至关重要,因为在C ++中extern
对象具有内部链接默认情况下。
请记住,为了使const
对象符合积分常量表达式(ICE)的条件,必须显示具有ICE初始值设定项的const int
对象的声明。