我有以下实现:
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
答案 0 :(得分:2)
您的问题与A
的重新声明有关,因为在C.cpp
它会看到A
一个到A.h
和另一个到B.h
的2个声明,所以只是防守A.h
在一个标题后卫中,以避免多次包含它,通常你应该始终保护你的标题:
#ifndef HEADER_A_h_INCLUDED
#define HEADER_A_h_INCLUDED
class A {...};
#endif
现在,如果你不止一次包括A.h
,那么这名后卫将把第二名包括为无效!