c++ - 包括在多个地方使用文件的守卫
问题描述
我可能在这里遗漏了一些明显的东西,但找不到什么。
我有一个 Utils.h 文件,其中包含我想在多个地方使用的实用程序函数。我知道避免重新定义编译器错误的方法是使用包含防护。
这是我所拥有的:
//----Utils.h----
#ifndef UH
#define UH
void UtilFunc() { }
#endif
.
//----A.h----
class A {
public:
A();
~A();
};
.
//----A.cpp----
#include "A.h"
#include "Utils.h"
A::A() {
UtilFunc();
}
A::~A(){ }
.
//----main.cpp----
#include "A.h"
#include "Utils.h"
int main() {
A myA;
UtilFunc();
return 0;
}
我的 Visual Studio 项目只包含文件 A.cpp 和 main.cpp ,当我尝试编译时,我得到:
错误 LNK2005 "void __cdecl UtilFunc(void)" (?UtilFunc@@YAXXZ) 已在 A.obj HeaderIncludeTest C:\Users\michalis\source\repos\HeaderIncludeTest\HeaderIncludeTest\main.obj 中定义 1
错误 LNK1169 找到一个或多个多重定义符号 HeaderIncludeTest C:\Users\michalis\source\repos\HeaderIncludeTest\HeaderIncludeTest\Debug\HeaderIncludeTest.exe 1
解决方案
两者都A.cpp
包括main.cpp
,Utils.h
因此它们都有一个定义,UtilFunc
因为你在. 在一个程序中有多个非内联函数的定义违反了一个定义规则。链接器检测到它并抱怨它。 UtilFunc
Utils.h
例如,您应该UtilFunc
内联,或者将其定义放在单独的编译单元Utils.cpp
中。
// Utils.h
#ifndef UH
#define UH
void UtilFunc();
#endif
// Utils.cpp
void UtilFunc() {}
推荐阅读
- r - 从混合模型中获取随机效应矩阵
- r - 为什么包含 load() 命令的附加代码不起作用?
- sql - 生成一个总和报告,具有两个不同的产品属性
- python - 迭代问题,内减法不能正常工作
- python - 如何使用 Selenium 在 Python 中的 ::before 和 ::after 跨度之间打印封闭文本?
- slack - 无法通过python使用slack api将上传的文件附加到消息
- html - VBA 语言翻译器 UDF 不使用特殊字符
- rust - Rust 是否会缩短生命周期以满足对其定义的约束?
- spring-boot - 我什么时候应该在 java 8 中使用 mapstruct 或转换器以避免容易出错?
- python - 遍历 pandas 数据框,从另一行中的数据更新值,然后删除另一行