c – 我可以停止使用“inline”吗?

这个问题在这里已经有一个答案:> what is/are the purpose(s) of inline?9个
由于完全由编译器决定是否内嵌函数,所以我可以完全停止使用这个关键字(假设它将内联所有内容).

解决方法

您可以停止使用内联作为优化技术.

内联基本上只有当您想要ODR (One Definition Rule)不适用时才有用.简而言之,您可以将函数标记为内联,并直接在一个文件中提供其定义,然后由多个翻译单元导入,而无需链接器就此提出以下问题:

foo.hpp

inline int foo() { return 42; }

Foo.cpp中

#include "foo.hpp" // <== THE LINKER WOULD COMPLAIN IF foo() WERE NOT inline,//     because its deFinition is imported also in main.cpp
void bar()
{
    int x = foo();
}

main.cpp中

#include "foo.hpp" // <== THE LINKER WOULD COMPLAIN IF foo() WERE NOT inline,//     because its deFinition is imported also in foo.cpp
int main()
{
    std::cout << foo();
}

内联关键字的存在(再次不保证编译器将执行内联)可确保链接器将合并这些定义.

当然,为了使这个合并操作是有意义的,标记为内联的功能的所有定义都必须是相同的.如果不是这种情况,您的程序具有Undefined Behavior,并且不需要诊断 – 这意味着您的编译器/链接器不需要检测到这种不一致,并告诉您有什么不对!

根据C11标准的第3.2 / 4段,其实:

Every program shall contain exactly one deFinition of every non-inline function or variable that is odr-used
in that program; no diagnostic required
. The deFinition can appear explicitly in the program,it can be found
in the standard or a user-defined library,or (when appropriate) it is implicitly defined (see 12.1,12.4 and
12.8). An inline function shall be defined in every translation unit in which it is odr-used.

请注意,您可以在不同的翻译单元中具有标记为内联和字面定义两次的相同功能,只要这些定义相同即可.

Foo.cpp中

inline int foo() // Has the same body in main.cpp,no problem!
{
    return 42;
}

main.cpp中

inline int foo() // Has the same body in foo.cpp,no problem!
{
    return 42;
}

int main()
{
    std::cout << foo();
}

但是,如果两个定义不同,您将在代码中注入UB,如以下示例所示:

Foo.cpp中

inline int foo()
{
    return 42;  // <== WATCH OUT! Different body in main.cpp
}

main.cpp中

inline int foo()
{
    return -42; // <== WATCH OUT! Different body in foo.cpp
}

int main()
{
    std::cout << foo();
}

这就是为什么当您通常将#定义的头文件直接提供给它们时,通常将函数标记为内联.

还要注意,类定义中直接内联的类成员函数自动标记为内联.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...