How do I create a header-only library?

前端 未结 4 1870
花落未央
花落未央 2020-12-23 02:29

I\'d like to package a library I\'m working on as a header-only library to make it easier for clients to use. (It\'s small and there\'s really no reason to put it into a sep

相关标签:
4条回答
  • 2020-12-23 02:54

    You can use the inline keyword:

    // header.hpp (included into multiple translation units)
    
    void foo_bad() {} // multiple definitions, one in every translation unit :(
    
    inline void foo_good() {} // ok :)
    

    inline allows the linker to simply pick one definition and discard the rest.

    (As such, if those definitions don't actually match, you get a good dose of undefined behavior...!)


    As an aside, member functions defined within a class-type, are implicitly marked 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 :(
    }
    
    0 讨论(0)
  • 2020-12-23 03:04

    Use header guards as Liz suggests and don't forget to put "inline" before your function methods.

    ie

    #ifndef MY_HEADER_H_
    #define MY_HEADER_H_
    
    inline RetType FunctionName( ParamType1 param1, ParamType2 param2 )
    {
        // Function body
        return retType;
    }
    
    #endif
    
    0 讨论(0)
  • 2020-12-23 03:07

    Also, I think you'll need to avoid any use of global variables or static variables in your header-only-library code.

    0 讨论(0)
  • 2020-12-23 03:17

    Use header guards for the parts that compile in one place.

    0 讨论(0)
提交回复
热议问题