我想将我正在处理的库打包为仅限标头的库,以便客户端更容易使用.(它很小,并且没有理由将它放入单独的翻译单元中)但是,我不能简单地将我的代码放在标题中,因为这违反了C++的一个定义规则.(假设库头包含在客户端项目的多个翻译单元中)
如何修改库以使其成为仅标题?
GMa*_*ckG 57
您可以使用inline关键字:
// header.hpp (included into multiple translation units)
void foo_bad() {} // multiple definitions, one in every translation unit :(
inline void foo_good() {} // ok :)
Run Code Online (Sandbox Code Playgroud)
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 :(
}
Run Code Online (Sandbox Code Playgroud)
使用标题保护,如Liz建议的那样,不要忘记在函数方法之前加入"inline".
即
#ifndef MY_HEADER_H_
#define MY_HEADER_H_
inline RetType FunctionName( ParamType1 param1, ParamType2 param2 )
{
// Function body
return retType;
}
#endif
Run Code Online (Sandbox Code Playgroud)