在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
答案 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
(没有它的主体),它仍然像是正常的函数调用。