gpt4 book ai didi

C++ 内联重新声明

转载 作者:太空狗 更新时间:2023-10-29 22:56:23 25 4
gpt4 key购买 nike

考虑以下示例(在同一翻译单元中):

inline void f();
void f() {}

f 的重新声明会发生什么? f 是否仍被视为内联

我查看了这种情况的标准,但我只在 10.1.6/6 [dcl.inline] 中找到了相反的情况:

[...] If the definition of a function or variable appears in a translation unit before its first declaration as inline, the program is ill-formed. [...]

我想要标准中的一些引用资料来指定在这种情况下会发生什么。

我看到了这个post ,但它没有在标准中显示明确的引用。我倾向于相信没有这样的引用。

最佳答案

What happens at the redeclaration of f? Is f still considered inline?

是的,f 仍然被认为是内联

可以在 [dcl.fct.spec] 中找到与 inline 函数说明符语义相关的标准部分:

A function declaration ... with an inline specifier declares an inline function. The inline specifier indicates to the implementation that inline substitution of the function body at the point of call is to be preferred to the usual function call mechanism.

An inline function shall be defined in every translation unit in which it is odr-used and shall have exactly the same definition in every case ([basic.def.odr]). [ Note: A call to the inline function may be encountered before its definition appears in the translation unit. — end note ] If the definition of a function appears in a translation unit before its first declaration as inline, the program is ill-formed. If a function with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required. An inline function with external linkage shall have the same address in all translation units.

[basic.def.odr] 中:

Every program shall contain exactly one definition of every non-inline function or variable that is odr-used in that program

另请参阅 [dcl.stc]/8 中的示例:

void h();
inline void h(); // external linkage

inline void l();
void l(); // external linkage

一切的解释是:

  • inline 作为函数说明符充当标志,表达您希望内联给定函数的调用。一旦在某个函数声明中遇到它,它就会为该特定函数重载保持“设置”状态,并且无法“取消设置”它。

  • 在函数的声明定义中指定内联并不重要,因为定义 is also一个声明,因为多个声明是 allowed
    但是,inline 说明符必须在 beforewith 函数的定义中遇到 before 它是 odr-使用(odr-use 意味着编译器需要实际发出调用该函数的代码,或者出于任何原因需要它的地址)。

  • inline 说明符在函数的链接上有 no effect,对于非静态全局函数,它仍然是外部的。如果一个 inline 函数(具有外部链接)的地址被获取,编译器将为其发出一个外联定义,确保链接器可以在必要时折叠多个定义(例如使用弱符号)。这样不同 TU 中的 inline 函数的地址将是相同的。

  • 一旦函数被声明为inline 并具有外部链接,它必须在所有其他使用它的翻译单元中被声明为inline

  • 您必须在 odr-使用它的每个翻译单元中提供 inline 函数的定义,并且必须完全相同。

关于C++ 内联重新声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48354134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com