我正在其他项目中使用的库上工作,并且具有以下头文件:
#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
答案 0 :(得分:3)
#pragma once
确保头文件在包含的每个翻译单元中仅包含一次。因此,如果将其包含在多个cpp文件中,则将获得多种实现。
声明您的功能inline
,例如:
inline unsigned int getNextUInt(std::istream &is)
{
...
}
或者,将函数实现放在一个cpp文件中。
必须在cpp文件中定义变量。在头文件中,您将拥有:
extern unsigned int uintBuffer;
,在cpp文件中,您有以下内容:
unsigned int uintBuffer;
当您使用类而不是全局变量和函数时,所有这些都变得更加容易。