gpt4 book ai didi

c++ - 对头文件和实现文件之间的关系感到困惑

转载 作者:行者123 更新时间:2023-11-28 00:57:40 25 4
gpt4 key购买 nike

我正在使用 Code::Blocks。当我创建头文件 foo.h 并将前向声明以及实现 放入其中时,编译工作正常。创建一个 foo.cpp 文件并且不向其中添加任何内容仍然有效。但是,当我在实现文件中包含头文件,但将实现保留在头文件中时,我会收到有关multiple declarations 的错误。

来 self 当前项目的示例

// header-file `GKit/math/blendprocs.cpp`
#include "GKit/utils/Color.h"

#ifndef _GKIT_MATH_BLENDPROCS_H_
#define _GKIT_MATH_BLENDPROCS_H_

namespace GKit {
namespace math {

void blendAoverB(GKIT_COLORBLENDPROC_ARGSX) {
D.a = A.a + (1 - A.a) * B.a;
D.r = (A.a * A.r + (1 - A.a) * B.a * B.r) / D.a;
D.g = (A.a * A.g + (1 - A.a) * B.a * B.g) / D.a;
D.b = (A.a * A.b + (1 - A.a) * B.a * B.b) / D.a;
GKIT_UTILS_COLOR_NORMALIZE(D);
}

}
}

#endif // _GKIT_MATH_BLENDPROCS_H_

// implementation-file `GKit/math/blendprocs.cpp`
#include "GKit/math/blendprocs.h"

// Compilation output
-------------- Build: Debug in GKit ---------------

Compiling: GKit\math\blendprocs.cpp
Linking console executable: bin_debug\GKit.exe
build_debug\GKit\math\blendprocs.o:C:\Users\niklas\Desktop\GKit/./GKit/math/blendprocs.h:10: multiple definition of `GKit::math::blendAoverB(GKit::utils::Color const&, GKit::utils::Color const&, GKit::utils::Color&)'
build_debug\main.o:C:\Users\niklas\Desktop\GKit/./GKit/math/blendprocs.h:10: first defined here
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
2 errors, 0 warnings

你能帮我理解这个错误吗?

最佳答案

您在标题中有一个定义。该定义将在包含该 header 的任何源文件中重复;因为在程序中有多个定义通常是错误的,所以构建失败。这被称为“单一定义规则”,有时被隐晦地称为 ODR。

两个最好的选择是:

  • 将定义移动到源文件中,只在文件头中留下一个声明,或者
  • 在定义中添加inline;这放宽了规则并允许在一个程序中进行多个定义,只要它们完全相同即可。

另外,你不应该为你的 include 守卫使用保留名称;您应该从 _GKIT_MATH_BLENDPROCS_H_ 中删除初始的 _;最好将这些守卫放在 header 的开头,在任何 #include 指令之前。

关于c++ - 对头文件和实现文件之间的关系感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10216252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com