C ++中的Extern和const

时间:2014-09-22 08:52:17

标签: c++ const extern

我已经看过几个关于这个问题的帖子,但是没有一个帖子能解释我的关注,所以我会在这里解释一下我理解的内容,如果我错了,请纠正我。

假设我有一个包含以下声明的头文件:

//definitions.h
extern const float fallingTime; 

现在,我有两个想要使用此声明的源文件。

//source1.cpp
#include "definitions.h"
const float fallingTime = 0.5f;
//use fallingTime 

//source2.cpp
#include "definitions.h"
//just use fallingTime (no definition required)

这就是我所做的;但现在,假设另一种方式继续下去。

//definitions.h
const float fallingTime = 0.5f; //Note that I don't use extern now

//source1.cpp
#include "definitions.h"
//just use fallingTime (no definition required)

//source2.cpp
#include "definitions.h"
//just use fallingTime (no definition required)

正如我从阅读几个来源得出的结论,前一种方法的优点是它节省了内存和编译时间,因为内存分配只发生一次(在source1.cpp的定义中),而在后一种方法中,内存分配发生在包含definitions.h(source1.cpp和source2.cpp)的每个源文件中。这是对的吗?

最后,什么意味着使用extern并同时定义常量?会不会等同于前一种做法?

//definitions.h
extern const float fallingTime = 0.5f;

2 个答案:

答案 0 :(得分:1)

在标头中定义const float fallingTime = 0.5f;时,翻译单元可能会也可能不会将值存储在二进制文件的数据部分中。

如果翻译单元中没有代码接受fallingTime的地址或引用,则编译器根本没有理由在数据部分中分配值。编译器可能会将fallingTime的用法替换为其值,因为它的定义在编译时可用于每个翻译单元。

使用extern const生成的代码必须从内存中加载fallingTime的值,因为它的定义在编译时不能在任何其他翻译单元中使用,而是定义{{1}的值。 1}}。

答案 1 :(得分:-2)

后者的问题是在C ++ 11之前的C ++中,取决于你的编译器,你可能会得到一个链接时错误,因为没有fallTime的地址。语言需要,你只需要在一个翻译单元中实例化它,而gcc对此非常严格。