c++ - C++ 中的 extern 和 const

标签 c++ constants 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;

最佳答案

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

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

使用 extern const 生成的代码将不得不从内存中加载 fallingTime 的值,因为它的定义在编译时在任何其他翻译单元中不可用,但一个定义 fallingTime 的值。

关于c++ - C++ 中的 extern 和 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25970038/

相关文章:

c - 如何定义外部变量和声明?

c - 声明还是定义?

c++ - 收集2 : ld returned 1 exit status error

c++ - 如何使用函数指针作为类中的参数

c++ - 无法使用 PhotoViewer.dll 执行 CreateProcess

c++ - 常量变量悖论

c++ - 在 C++ 中使用 boolean 数组减少错误

javascript - 维护: Assigning numbers to constants

c++ - 指向常量引用 C++ 的常量指针

c - 函数原型(prototype)应该总是在它的头文件中吗?