in-regards 对在 C++ 中 header 文件中定义函数的陷阱感到困惑

A bit confused in-regards to pitfalls that come along with defining functions in header files in C++

有人告诉我,在 header 文件中定义函数确实是个好主意的唯一情况是函数被标记为内联或者是函数模板。显然,或者有人告诉我,造成这种情况的一个关键原因是一个定义规则——一个只允许每个翻译一个函数定义的规则 unit.I 被告知你将为每个 cpp 获得该函数的一个定义包含 header 的文件。然而,我在理解如何为 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.cb.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);

您在 header 中放置声明,例如sum.h,所以稍后你可以使用 sum 的定义,例如置于 sum.cpp。后来,链接器在sum.oobject file中找到sum的定义。

由于 #include pragma 被替换为 header 的内容,如果您将函数的定义放在 header 中,您将有多个相同的函数和链接器错误。