为了账号安全,请及时绑定邮箱和手机立即绑定

外排的问题

外排的问题

C++ C
慕尼黑8549860 2019-07-15 10:17:49
外排的问题我理解“内联”本身就是对编译器的一种建议,在它的设计过程中,它可能会或可能不会内联这个函数,它还会生成可链接的对象代码。我认为“静态内联”也是如此(可能是内联,也可能不是内联),但是在内联时不会生成可链接的对象代码(因为没有其他模块可以链接到它)。“内插”在图片中的位置是什么?假设我想用内联函数替换预处理器宏,并要求这个函数内联(例如,它使用_file_和_line_宏,应该为调用方解析,而不是这个被调用的函数)。也就是说,如果函数没有内联,我希望看到编译器或链接器错误。“extern inline”会这样做吗?(我假设,如果没有,除了坚持宏之外,没有其他方法可以实现这种行为。)C+和C之间有什么区别吗?不同的编译器供应商和版本之间有区别吗?
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

在K&R C或C 89中,内联不是语言的一部分。许多编译器将其实现为扩展,但对于它的工作方式却没有定义的语义。GCC是最早实施内联的国家之一,并介绍了inlinestatic inline,和extern inline构造;大多数预C99编译器通常遵循它的要求。

GNU89:

  • inline

    :函数可能是内联的(不过只是个提示)。一个线外的版本总是被发出和外部可见。因此,您只能在一个编译单元中定义这样一个内联,而其他每一个编译单元都需要将其视为一个离线函数(否则在链接时会得到重复的符号)。
  • extern inline

    不会生成出线版本,但可能会调用一个版本(因此,您必须在其他编译单元中定义该版本)。不过,单定义规则是适用的;出线版本必须具有与此处提供的内联代码相同的代码,以防编译器调用该代码。
  • static inline

    将不会生成一个外部可见的出线版本,尽管它可能会生成一个文件静态版本。“一个定义”规则不适用,因为从来没有发出外部符号,也没有对外部符号的调用。

C99(或GNU99):

  • inline

    *与GNU89一样“内联外挂”;没有发出外部可见函数,但可能会调用一个函数,因此必须存在
  • extern inline

    类似于GNU89“内联”:发出外部可见代码,因此最多一个翻译单元可以使用此代码。
  • static inline

    *像GNU89“静态内联”。这是gnu 89和c99之间唯一的便携式

C+:

任何地方内联的函数都必须在任何地方内联,定义相同。编译器/链接器将排序符号的多个实例。没有定义static inlineextern inline,尽管许多编译器都有它们(通常遵循gnu 89模型)。


查看完整回答
反对 回复 2019-07-15
?
偶然的你

TA贡献1841条经验 获得超3个赞

我相信你误解了_和_基于以下陈述:

因为它使用_file_和_line_宏,应该为调用方解析,而不是这个被调用的函数。

编译有几个阶段,第一个阶段是预处理。_因此,当编译器可以考虑内联函数时,它们已经被替换了。


查看完整回答
反对 回复 2019-07-15
  • 3 回答
  • 0 关注
  • 446 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信