【发布时间】:2019-02-04 14:19:09
【问题描述】:
我有一个包含多个头文件和.cpp 文件的项目。
所有的头文件都有包含保护。
有一个名为Constants.h 的文件,我在其中定义了一些常量。其中一些带有定义,一些作为常量变量。
还有更多包含代码的 header-.cpp-file 对。其中一个确实包含一个类,其他的则不包含。
当我将我的文件包含到我的主文件(一个 arduino 草图)中时,我收到很多链接器错误,声称某些变量有多个定义。
我读到这主要发生在您包含 .c 或 .cpp 文件时,我不这样做。所有.cpp 文件只包含其相应的头文件。
我确实设法找到了多个解决方案:
1) inline:
通过函数,inline 可以解决这个问题。但是,这对于变量是不可能的。
2) 匿名namespace:
这是我使用的解决方案之一。我在所有有问题的定义周围放置了匿名名称空间。它确实有效,但我不明白为什么会这样。谁能帮我理解一下?
3) 将定义移动到.cpp 文件中:
这是我有时使用的另一种方法,但并非总是可行,因为我需要在其他代码中定义一些不属于此头文件或其代码的定义(我承认这是糟糕的设计)。
谁能向我解释问题出在哪里以及为什么这些方法有效?
【问题讨论】:
-
@NathanOliver - 这个问题是关于 C 和 C++ 之间的细微差别。那个骗子是垃圾。
-
@StoryTeller 有一个名为 Constants.h 的文件,我在其中定义了一些常量。其中一些带有定义,一些作为常量变量。 看起来像是一个非常明确的 OP 在多个 TU 中包含变量定义。
-
@NathanOliver - 除了 C++
const whatever bar = foo;在命名空间范围内默认具有内部链接。 -
是否涉及C代码?否则你可能会删除 C 语言标签。