首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套命名空间中的重复符号

嵌套命名空间中的重复符号
EN

Stack Overflow用户
提问于 2019-02-12 20:36:52
回答 1查看 286关注 0票数 0

我正在处理一个在我的其他项目中使用的库,并且我有以下头文件:

代码语言:javascript
复制
#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不应该做到这一点吗?

编辑:错误信息的说明:

代码语言:javascript
复制
duplicate symbol __ZN8My_Library11NodeReaders13HumanReadable10uintBufferE in:
    obj/project/Debug/ParseDriver.o
    obj/project/Debug/ParseService.o
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-12 20:39:59

#pragma once确保头文件只包含在它包含的每个翻译单元中一次。因此,如果您将它包含在多个cpp文件中,您将得到多个实现。

声明您的函数inline,例如:

代码语言:javascript
复制
inline unsigned int getNextUInt(std::istream &is)
{
    ...
}

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

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

代码语言:javascript
复制
extern unsigned int uintBuffer;

在cpp文件中有以下内容:

代码语言:javascript
复制
unsigned int uintBuffer;

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54658343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档