use*_*003 4 c gcc inline header
我有这个包含很多内联函数的头文件,编译后说:函数***的多个定义,函数看起来像这样:
inline int testab(int a, int b)
{
return a>b;
}
Run Code Online (Sandbox Code Playgroud)
在内联前添加静态后,错误消失了.这是正确的方法吗?或者我错过了什么?我以为我可以在这样的标题中设置内联函数.
inline 或者,一旦标题被复制到至少两个文件中,您就不能再链接文件了.
您可以在标头中安全地实现函数的唯一方法是使用static.这样,函数的每个副本对其他副本都是不可见的.
请注意,将它们一起使用没有限制,因此您可以安全地编写:
static inline bool testab(int a, int b)
{
return a>b;
}
Run Code Online (Sandbox Code Playgroud)
inline告诉编译器您认为该函数足够小以便内联.那就是你告诉编译器你不认为内联函数的额外空间与它的(轻微的)(可能的)性能增益相反.但是大多数编译器是足够的智能来决定自己和你的关键字,他们只会倾向于更多的内联,而不必总是听你的.当然,这取决于编译器.有些编译器可能完全忽略关键字.
static另一方面,意味着无论定义静态变量的范围,它都将在其外部不可见.如果static函数中有变量,则它在外部是不可见的.如果static文件中有变量(即静态全局变量),它将在其外部不可见,这意味着在编译链接器以查看并混淆之后符号不存在.这就是为什么,如果你编写了一个库,其中有全局变量或函数不应该在库外可见,你应该将它们声明为static.
显然,根据这个答案,inline函数不应该为链接器导出其标识符.尽管如此,人们可以static用任何一种方式来加以说明,以使其更加清晰.显然,一些编译器无论如何都会导出标识符,因此在这些情况下static确实是必要的.