外排的问题

外排的问题

我理解“内联”本身就是对编译器的一种建议,在它的设计过程中,它可能会或可能不会内联这个函数,它还会生成可链接的对象代码。

我认为“静态内联”也是如此(可能是内联,也可能不是内联),但是在内联时不会生成可链接的对象代码(因为没有其他模块可以链接到它)。

“内插”在图片中的位置是什么?

假设我想用内联函数替换预处理器宏,并要求这个函数内联(例如,它使用_file_和_line_宏,应该为调用方解析,而不是这个被调用的函数)。也就是说,如果函数没有内联,我希望看到编译器或链接器错误。“extern inline”会这样做吗?(我假设,如果没有,除了坚持宏之外,没有其他方法可以实现这种行为。)

C+和C之间有什么区别吗?

不同的编译器供应商和版本之间有区别吗?


慕尼黑8549860
浏览 447回答 3
3回答

人到中年有点甜

在K&R C或C 89中,内联不是语言的一部分。许多编译器将其实现为扩展,但对于它的工作方式却没有定义的语义。GCC是最早实施内联的国家之一,并介绍了inline, static 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 inline或extern inline,尽管许多编译器都有它们(通常遵循gnu 89模型)。

偶然的你

我相信你误解了_和_基于以下陈述:因为它使用_file_和_line_宏,应该为调用方解析,而不是这个被调用的函数。编译有几个阶段,第一个阶段是预处理。_因此,当编译器可以考虑内联函数时,它们已经被替换了。
打开App,查看更多内容
随时随地看视频慕课网APP