c++ - 头文件中定义的静态对象和 cpp 文件中定义的静态对象有什么区别?
问题描述
假设我有一个头文件,并假设复制宏已得到处理:f1.h:
Object& getObject() {
static Object obj;
return obj;
}
在包含此标头的任何地方,翻译单元都将拥有自己的 obj 副本。那么,如果 a.cpp、b.cpp、ch 包含这个头文件,obj 会被实例化 3 次?
现在,如果我有以下内容:
f2.h:
Object& getObject();
f2.cpp:
#include <f2.h>
Object& getObject() {
static Object obj;
return obj;
}
在这种情况下,我的标头被包含在内,但符号仅在 cpp 文件中创建。因此,链接器只能找到在 cpp 文件中创建的单个静态 obj 对象,而每个引用 .h 文件的翻译单元都会获得该符号?
这是对正在发生的事情的正确直觉还是这里有更多的作用?
解决方案
那么,如果 a.cpp、b.cpp、ch 包含这个头文件,obj 会被实例化 3 次?
该应用程序不会链接。最终你会得到一个重复的函数链接器错误。
在第二种情况下,您只有一个对象。
在任何情况下,正确的做法是将所有定义都放在 .cpp 文件中,或者将函数定义为inline
头文件中,这样无论包含多少次,它们都只定义一次。
推荐阅读
- javascript - 多次处理同一个请求
- php - 从超过 2 个表中选择数据的简单方法
- java - 将图像从 Angular 7 上传到 Spring-boot
- java - 构建具有依赖关系的 jar 文件的问题
- python - 通过循环抓取不同的日期
- reactjs - 在 Redux 中,我是否需要立即知道哪些 reducer 对动作类型感兴趣?
- java - Java [Android] [Spring] - 反序列化一个字节数组
- python - 如何过滤掉静态语料库中的爬虫陷阱
- floating-point - 在 IEEE754 中非规格化数到最小正规数的一半到偶数
- markdown - pandoc 是否支持在其模板中创建降价表?