Дубликат символа во вложенном пространстве имен - PullRequest
0 голосов
/ 12 февраля 2019

Я работаю над библиотекой, которую я использую в других моих проектах, и у меня есть следующий заголовочный файл:

#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 голосов
/ 12 февраля 2019

#pragma once гарантирует, что файл заголовка включается только один раз в каждую единицу перевода, в которую он включен. Поэтому, если вы включите его в более чем один файл cpp, вы получите несколько реализаций.

Объявите свои функцииinline Например:

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

Или поместить реализации функции в файл cpp.


Переменные должны быть определены в файле cpp.В заголовочном файле у вас будет это:

extern unsigned int uintBuffer;

, а в файле cpp у вас это будет:

unsigned int uintBuffer;

Все это становится проще, когда вы вместо этого используете классыглобальных переменных и функций.

...