c - 声明内联函数后,什么会再次导致多重定义错误?

标签 c gcc header inline

我有一个包含很多内联函数的头文件,编译后它说: 函数的多重定义***,函数如下所示:

inline int testab(int a, int b)
{
        return a>b;
}

我在inline前面加上static后,错误就没有了。这是正确的方法吗?或者我错过了什么?我想我可以在这样的 header 中设置内联函数。

最佳答案

内联 无论是否内联,一旦 header 被复制到至少两个文件中,您就无法再链接这些文件。

在 header 中安全实现函数的唯一方法是使用static。这样,函数的每个副本对其他副本都是不可见的。

请注意,将它们一起使用没有任何限制,因此您可以安全地编写:

static inline bool testab(int a, int b)
{
        return a>b;
}

编辑:更多细节

inline 告诉编译器认为该函数足够小可以内联。也就是说,您告诉编译器您认为用于内联函数的额外空间与它的(轻微)(可能)性能增益相比并不重要。然而,大多数编译器都足够聪明,可以自行决定并使用您的关键字,他们只会倾向于更多地内联,而不一定总是听您的。当然,这取决于编译器。一些编译器可能会完全忽略该关键字。

static 另一方面,意味着无论定义了一个静态变量的范围是什么,它在它之外都是不可见的。如果函数中有一个 static 变量,它在函数外部是不可见的。如果文件中有一个 static 变量(即静态全局变量),它在外部是不可见的,这意味着该符号在编译后不存在供链接器查看并混淆.这就是为什么,如果您编写了一个库,其中有全局变量或函数,这些变量或函数不应该在库外可见,您应该将它们声明为 static

编辑 2:更正

显然,根据 this回答,inline 函数不应该为链接器导出它的标识符。尽管如此,还是可以将 static 附加到其中,以使其更清晰。同样显然,一些编译器无论如何都会导出标识符,因此在这些情况下 static 确实是必要的。

关于c - 声明内联函数后,什么会再次导致多重定义错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8501856/

相关文章:

html - 如何 - 使页眉跨度为全宽并位于页面顶部

c - 使用 free 理解 malloc 和指针递增

在可能为空或可能不为空时清除 C 中的标准输入

c - 在 C 中,我有一个浮点变量减少了不正确的数量

旧版本 GCC 的 C++/Fortran 间语言 ABI 问题

c - 优化函数进入/退出 (gcc)

c - Unsigned int 未给出预期值

java - Android:在页眉和页脚之间显示 ListView

javascript - 将 HTML head 放在另一个文件中

python - 如何生成数字范围的所有组合