У меня есть следующая реализация:
заголовок A:
class A
{
public:
foo();
};
A имеет свой собственный файл .cpp с реализацией для foo ()
// заголовок B
#include "A.h"class B
{
public foo();
};
Примечание: B не имеет собственного заголовка
Теперь в классе C.cpp я хочу повторно использовать заголовок A и реализацию из B.o. Так что в C.cpp я делаю:
//C.cpp
#include "A.h"....
B b;
b.foo();
..
Когда я скомпилирую вышеупомянутое, я обязательно получу ошибку объявления для функции foo (). Я хочу знать, есть ли какой-либо способ сказать компилятору GNU взять B.o и опустить A.o … Или сказать компилятору рассмотреть первый объект в файле make, который содержит реализацию, и игнорировать остальные?
Я использую GNU v2.16
Ваша проблема связана с переоценкой A
так как в C.cpp
он увидит 2 объявления A
один через A.h
и другие через B.h
так что просто охранник A.h
в защите заголовка, чтобы избежать включения его более одного раза, как правило, вы всегда должны охранять свои заголовки:
#ifndef HEADER_A_h_INCLUDED
#define HEADER_A_h_INCLUDED
class A {...};
#endif
Теперь, если вы включите A.h
более одного раза этот охранник заставит второго включить ничего!
Других решений пока нет …