在静态库中内联类方法

时间:2018-11-02 07:17:15

标签: c++ static-libraries inline

this问题中,答案指出,为内联静态库的函数,该函数在头文件中声明为inline,在源文件中声明为extern。但是,在C ++中,如果这样做,则会生成编译器错误(Redeclaration of member is not allowed)。用哪种正确的方法编写函数,使其与C语言中的函数相同?

标题:

class Int64
{
    uint64_t a;
public:
    inline void flip() { a = ~a; }

};

来源:

extern void Int64::flip(); // redeclaration of member is not allowed

1 个答案:

答案 0 :(得分:0)

在C ++中,仅当函数代码在编译时可用时才可以将函数声明为inline(如果您确实要内联该函数代码)。因此,您无法在已编译的静态库中实现函数主体,而使用该静态库时,该函数体将不可用。如果这样做,则此函数调用将类似于普通的函数调用。

来自cppreference

  

2)内联函数的定义必须出现在   所访问的翻译单位(不一定在   访问点)。

尽管如此,您可以在静态库头文件中定义inline函数(例如仅头文件的函数)。

顺便说一句,请记住inline只是一个建议。编译器将决定是否内联。通常在启用优化功能的情况下编译代码时会发生这种情况,但是特别是当您不优化代码时,通常会看到函数没有内联。

例如,检查包含2个文件的小型静态库:

test.h

#pragma once

inline int sum(int a, int b) 
{
    return a + b;
}

int sub(int a, int b);

test.cpp

int sub(int a, int b)
{
    return a - b;
}

使用此库时,将内联sum,而sub将是正常的正常调用。请记住,您甚至也可以在库头文件中将sub定义为inline(没有它的主体),它仍然像是正常的函数调用。