对于在C++头文件中定义函数带来的陷阱,有点困惑
A bit confused in-regards to pitfalls that come along with defining functions in header files in C++
有人告诉我,在头文件中定义函数的唯一真正好主意的事件是函数是否标记为内联或函数模板。显然,或者我被告知,其中一个关键原因是一个定义规则 - 一个只允许每个翻译单元一个函数定义的规则。有人告诉我,对于包含该标头的每个 cpp 文件,您将获得该函数的一个定义。但是,我在理解如何为C++中的每个 cpp 文件获取该函数的一个定义时遇到了问题。我很难想象为什么会这样。那么,有人会介意提供一些见解来解释为什么会这样吗?干杯!
当您#include
文件时,编译器的行为就像您刚刚将文件复制粘贴到当前文件中一样。
也就是说,如果您有三个文件:
// header.h
void foo() {/* do stuff */}
// a.c
#include "header.h"
void a_func() {/* do stuff */}
// b.c
#include "header.h"
void b_func() {/* do stuff */}
然后编译器会将其视为将header.h
的内容复制到a.c
和b.c
中 - 也就是说,它的行为与以下情况完全相同:
// a.c
void foo() {/* do stuff */}
void a_func() {/* do stuff */}
// b.c
void foo() {/* do stuff */}
void b_func() {/* do stuff */}
显然,这里有多个foo
定义 - 因为每个文件中都有一个。
对于简单的函数,如sum
,定义将是:
double sum(double a, double b) { return a + b; }
和声明:
double sum(double a, double b);
您将声明放在标题中,例如 sum.h
,所以以后你可以使用sum
的定义,例如放在sum.cpp
中。稍后,链接器在对象文件中查找 sum 的定义sum.o
。
由于#include
杂注被替换为标头的内容,因此如果将函数的定义放在标头中,则会有多个相同的函数,并且还会出现链接器错误。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 基类没有析构函数,但派生类有析构函数。我是否需要寻找与堆无关的任何陷阱?
- 对于在C++头文件中定义函数带来的陷阱,有点困惑
- Nodejs C++事件发射器.加载项错误.MakeCallback中没有函数.method=发出中止陷阱:6
- 虚函数陷阱和使用基函数