我想将我正在处理的库打包为仅限标头的库,以便客户端更容易使用。 (它很小,并且没有理由将它放入单独的翻译单元中)但是,我不能简单地将我的代码放在标题中,因为这违反了C ++的一个定义规则。 (假设库头包含在客户端项目的多个翻译单元中)
如何修改库以使其成为仅标题?
答案 0 :(得分:56)
您可以使用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 :(
}
答案 1 :(得分:7)
使用Liz建议的标题保护,不要忘记在函数方法之前加入“inline”。
即
#ifndef MY_HEADER_H_
#define MY_HEADER_H_
inline RetType FunctionName( ParamType1 param1, ParamType2 param2 )
{
// Function body
return retType;
}
#endif
答案 2 :(得分:4)
另外,我认为你需要避免在只有头文件库的代码中使用全局变量或静态变量。
答案 3 :(得分:0)
对在一个地方编译的部分使用标题保护。