【问题标题】:What is an 'extern inline' function and when to use?什么是“外部内联”函数以及何时使用?
【发布时间】:2014-12-24 22:43:47
【问题描述】:

有这样的东西,它在最新的 C++ 草案中:

第 7.1.2 .4 节:

应在每个翻译单元中定义内联函数 它是 odr-used 并且在每个 案例(3.2)。 [注意:可能会遇到对内联函数的调用 在其定义出现在翻译单元之前。 — 尾注] 如果 函数的定义出现在翻译单元中 第一个声明为内联,程序格式错误。 如果一个函数 带有外部链接的在一个翻译单元中被声明为内联,它 应在其出现的所有翻译单元中声明为内联; 不需要诊断。具有外部链接的内联函数 在所有翻译单元中应具有相同的地址。静态局部 外部内联函数中的变量总是指同一个 目的。在外部内联函数体内定义的类型是 每个翻译单元都使用相同的类型。

关于这是什么以及何时使用它的一些见解?

【问题讨论】:

  • 可能是链接时优化提示?

标签: c++ c++14


【解决方案1】:

extern对于函数来说是多余的,所以声明一个函数extern inline是没有意义的。例如,如果您在全局范围内声明了一个函数 inline,则将适用本节的规则。同样,如果您在全局范围内声明了一个类并在类定义中定义了一个成员函数,那么这样的函数将是隐式 inline

何时应该声明函数inline 的问题是我不打算在这里打开的一大堆蠕虫。见:When should I write the keyword 'inline' for a function/method?

【讨论】:

  • static 可能值得一提。
【解决方案2】:

我不熟悉 C++ 中的这个草案特性,以及它是否已成为标准。我认为它可能是从 C 中借用了一个特性。


在 C(我认为是 C99?)中,extern inline 用于源文件,而不是头文件。指示工具从此源生成的目标文件应该是包含最终实现的目标文件。没有它,链接器必须选择一个站点或复制符号。

例如在my_alloc.h:

inline char *my_alloc(size_t len) { return (char*)malloc(len); }

my_alloc.c:

extern inline char *my_alloc(size_t len);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 2012-03-07
    • 2015-12-24
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多