C ++ Исправление ошибки множественного определения, когда заголовок (a.hpp) включен в заголовок (b.hpp) соответствующего источника (b.cpp) и main.cpp - PullRequest
0 голосов
/ 11 мая 2019

У меня есть следующие четыре файла a.hpp , b.hpp , b.cpp и main.cpp в Ubuntu 16.04LTS, которые имитируют мои оригинальные файлы.

a.hpp

#ifndef A_H
#define A_H

#include <iostream>

namespace Utility{
    typedef struct _structure{
        int v;
        int w;
    }aStructure;

    void foo(){
        std::cout << "foo" << std::endl;
    }

    void goo(){
        foo();
    }
}

#endif

b.hpp

#ifndef B_H
#define B_H

#include <iostream>

#include "a.hpp"

class bCls{
    private:
        int x;
    public:
        void moo(Utility::aStructure s);
};

#endif

b.cpp

#include <iostream>

#include "a.hpp"
#include "b.hpp"

void bCls::moo(Utility::aStructure s){
    std::cout << "moo" << std::endl;
}

main.cpp

#include <iostream>

#include "a.hpp"
#include "b.hpp"

int main(){

    Utility::aStructure s;
    bCls u;

    u.moo(s);

    return 0;
}

Когда я пытаюсь скомпилировать, используя g ++ -std = c ++ 11 b.cpp main.cpp , выдается следующее сообщение об ошибке:

/tmp/ccwvPrRr.o: In function `Utility::foo()':
main.cpp:(.text+0x0): multiple definition of `Utility::foo()'
/tmp/ccCVJOoH.o:b.cpp:(.text+0x0): first defined here
/tmp/ccwvPrRr.o: In function `Utility::goo()':
main.cpp:(.text+0x23): multiple definition of `Utility::goo()'
/tmp/ccCVJOoH.o:b.cpp:(.text+0x23): first defined here
collect2: error: ld returned 1 exit status

Мой поиск привел к Почему я получаю многократную ошибку определения, когда включен заголовок? . Но одно отличие в моем коде состоит в том, что a.hpp требуется в каждом из b.hpp , b.cpp и main.cpp .

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

...