我正在处理一个在我的其他项目中使用的库,并且我有以下头文件:
#pragma once
#include <iostream>
#include <map>
#include "my_library/core/Structures.h"
namespace My_Library
{
namespace NodeReaders
{
namespace HumanReadable
{
char charBuffer[256];
unsigned int uintBuffer;
unsigned long long microsecondBuffer;
unsigned int getNextUInt(std::istream & is)
{
/// Implementation
}
unsigned long getNextMicroseconds(std::istream & is)
{
/// Implementation
}
...
}; // namespace HumanReadable
}; // namespace NodeReaders
}; // namespace My_Library我尝试将它包含在几个不同的源文件中,但是每当我这样做时,我就会得到一个错误,即这里定义的每个使用的函数都有一个重复的符号。为什么我会得到一个重复的符号错误?难道#pragma once不应该做到这一点吗?
编辑:错误信息的说明:
duplicate symbol __ZN8My_Library11NodeReaders13HumanReadable10uintBufferE in:
obj/project/Debug/ParseDriver.o
obj/project/Debug/ParseService.o发布于 2019-02-12 20:39:59
#pragma once确保头文件只包含在它包含的每个翻译单元中一次。因此,如果您将它包含在多个cpp文件中,您将得到多个实现。
声明您的函数inline,例如:
inline unsigned int getNextUInt(std::istream &is)
{
...
}或者,将函数实现放在cpp文件中。
变量必须在cpp文件中定义。在头文件中,您将拥有以下内容:
extern unsigned int uintBuffer;在cpp文件中有以下内容:
unsigned int uintBuffer;当您使用类而不是全局变量和函数时,所有这些都变得更容易了。
https://stackoverflow.com/questions/54658343
复制相似问题