Вы можете использовать ключевое слово inline
:
// header.hpp (included into multiple translation units)
void foo_bad() {} // multiple definitions, one in every translation unit :(
inline void foo_good() {} // ok :)
inline
позволяет компоновщику просто выбрать одно определение и отбросить остальные.
(Таким образом, если эти определения на самом деле не совпадают, вы получите хорошую дозу неопределенного поведения ...!)
Кроме того, функции-члены, определенные в типе класса, неявно помечены inline
:
struct myclass
{
void i_am_inline_implicitly()
{
// because my definition is here
}
void but_i_am_not();
void neither_am_i();
};
inline void myclass::but_i_am_not()
{
// but that doesn't mean my definition cannot be explicitly inline
}
void myclass::neither_am_i()
{
// but in this case, no inline for me :(
}