ошибка множественного определения с использованием пространства имен - PullRequest
0 голосов
/ 11 июля 2020

Я создал файл заголовка abc.hpp, который содержит пространство имен нескольких функций.

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

Мои другие файлы создаются как библиотека и выполняются.

ab c .hpp :

#ifndef __ABC_HPP__
#define __ABC_HPP__

namespace abc {

    void sendtext(const char* msg)
    {
        create_context(mycontext);
        send_context(create_context,msg)
    }

    void sendtextwitherrno(const char* msg, int errn)
    {
        create_context(mycontext);
        send_context(create_context,msg, errn)
    }
};

#endif

тест. cpp:

#include"abc.hpp"
int main()
{
    abc::sendtext("hello world");
    abc::sendtextwitherrno("hello error no",140);
    return 0;
}

1 Ответ

2 голосов
/ 11 июля 2020

Вы можете обрабатывать файлы заголовков, как будто они скопированы в ваши файлы реализации. Таким образом, помещая определения функций в заголовки, эти определения появляются в нескольких единицах перевода (грубо говоря, файлы компилятора .cpp). Это недопустимо - как компилятор должен сообщать между ними, если они окажутся разными?

Обычно у вас будет пара .h / .cpp с объявлениями функций, идущими в .h, и определения функций в .cpp. Таким образом, определение появляется только один раз во всей вашей программе.

Я могу разделить ваш код следующим образом:

ab c .hpp:

#ifndef __ABC_HPP__
#define __ABC_HPP__
// function **declarations**
namespace abc{
    void sendtext(const char* msg);
    void sendtextwitherrno(const char* msg, int errn);
}
#endif

ab c. cpp:

#include "abc.hpp"
#include "context.hpp" // I guess this might be where create_context and send_context come from
// function **definitions**
namespace abc{
    void sendtext(const char* msg){
        create_context(mycontext); // not sure where mycontext is supposed to live?
        send_context(create_context,msg)
    }

    void sendtextwitherrno(const char* msg, int errn){
        create_context(mycontext);
        send_context(create_context,msg, errn);
    }
}

тест. cpp:

#include "abc.hpp"
int main(){
    abc::sendtext("hello world");
    abc::sendtextwitherrno("hello error no",140);
    return 0;
}

Другой способ - пометить функции как inline - это говорит компилятору, что вы намеренно повторяете определение функции повсюду, и вам лучше убедиться, что определение всегда идентично. Насколько ты уверен? Существуют ли разные макросы или разные флаги компилятора в разных местах, где используется функция?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...