我想包我的工作作为一个只有标题 - 库库,使客户端更容易使用。 (这是小,实在没有理由把它变成一个单独的翻译单元)。但是,我不能简单地把我的代码在头,因为这违反了C ++的一个定义规则。 (假设库头被包括在客户项目的多个翻译单元)

一个人如何修改库,使之仅邮件头?

有帮助吗?

解决方案

可以使用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 :(
}

其他提示

使用头卫士为利兹建议,不要忘记把“内嵌”功能的方法之前。

#ifndef MY_HEADER_H_
#define MY_HEADER_H_

inline RetType FunctionName( ParamType1 param1, ParamType2 param2 )
{
    // Function body
    return retType;
}

#endif

另外,我觉得你需要避免在仅标头库代码的任何使用全局变量或静态变量的。

使用头部防护装置为在一个地方编译部分。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top