嵌套名称空间中的重复符号

时间:2019-02-12 20:36:52

标签: c++ namespaces header-files

我正在其他项目中使用的库上工作,并且具有以下头文件:

#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

1 个答案:

答案 0 :(得分:3)

#pragma once确保头文件在包含的每个翻译单元中仅包含一次。因此,如果将其包含在多个cpp文件中,则将获得多种实现。

声明您的功能inline,例如:

inline unsigned int getNextUInt(std::istream &is)
{
    ...
}

或者,将函数实现放在一个cpp文件中。


必须在cpp文件中定义变量。在头文件中,您将拥有:

extern unsigned int uintBuffer;

,在cpp文件中,您有以下内容:

unsigned int uintBuffer;

当您使用类而不是全局变量和函数时,所有这些都变得更加容易。