C++ C+中的外部和常量+;

C++ C+中的外部和常量+;,c++,constants,extern,C++,Constants,Extern,关于这个问题,我已经看过好几篇文章,但没有一篇能很好地解释我的担忧,所以我将在这里解释我的理解,如果我错了,请纠正我 假设我有一个具有以下声明的头文件: //definitions.h extern const float fallingTime; 现在,我有两个源文件想要使用这个声明 //source1.cpp #include "definitions.h" const float fallingTime = 0.5f; //use fallingTime //source2.cpp

关于这个问题,我已经看过好几篇文章,但没有一篇能很好地解释我的担忧,所以我将在这里解释我的理解,如果我错了,请纠正我

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

//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;

后面的问题是,在C++之前,C++依赖于编译器,可以得到一个Link时间错误,因为没有用于FalpTimes的地址。该语言要求您精确地在一个翻译单元中实例化它,而gcc在这方面特别严格。

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

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


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

值的单元,用于检查const的外部和内部链接。它也是编译器依赖..与任何答案都不相关,但为什么要使用
float
?与双精度相比,唯一的性能提升将来自RAM芯片,而不是CPU本身(可能使用80位浮点)。顺便说一句,0.5可以非典型地用浮点表示,因为它是一个二元有理数。它依赖于编译器,但第二种方法很可能会看到
fallingTime
在不断传播过程中被优化掉。对不起,我不明白。对于“后一个”,您是指同时使用extern和定义吗?@FrancisMoy“假设以另一种方式继续”中的代码,因此,对于extern(外部链接),我们强制为常量分配一个内存地址,如果获取引用或常量地址,这可能是必需的,是吗?不是。唯一强制内存地址的事情是在源文件中定义它(或多或少。有一些微妙之处)。全局和命名空间范围
const
对象具有内部链接(隐式
static
应用)。自C++98以来,声明就是定义,不需要其他定义。除非明确标记为
extern
。你的答案不正确。那么,你是说在这种情况下,两种方法在内存和编译时间上是等价的吗?@FrancisMoy为你更新了答案。好吧,我的推理是错误的。那么,如果第二种方法可能更为优化(从编译时间/内存的角度来看),为什么通常建议第一种方法作为最佳实践?那么对于常量使用extern的优势是什么?第二种方法的唯一问题是@TomTanner?@FrancisMoy解释的问题为什么第一种方法通常被认为是最佳实践哪里第二种方法的唯一问题是TomTanner解释的问题-我认为他的答案不准确。@FrancisMoy好吧,
const
在全局和命名空间范围级别意味着内部链接,即
static const
const
相同,但不是
extern const
。这种行为是在C++中专门实现的,以避免使用宏来实现常量,…我同意你的看法。