c – 标题中定义的函数是否保证内联?

前端之家收集整理的这篇文章主要介绍了c – 标题中定义的函数是否保证内联?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我在头文件中定义非成员函数,它是否总是由编译器内联,或者编译器是否根据其启发式选择?我知道__inline只是一个提示,是否与标题中的函数相同?

解决方法

请记住,在标题中包含某些内容与直接在源文件中键入内容没有什么不同.因此,就编译器而言,在头文件中没有任何区别;它从来不知道它在那里.

因此,当您在头文件中定义一个函数,并将该头文件包含在文件中时,就像您只是直接在文件中键入该函数一样.所以现在问题是,“编译器是否选择基于启发式内联事物?”

答案是“这取决于编译器”.该标准不保证内联或不内联.也就是说,任何现代编译器都会对其内联的内容非常聪明,可能是通过启发式方法.

但是,我们谈到了一个有趣的观点.想象一下,您在标题中有一个函数,并在多个源文件中包含该标题.然后,您将跨翻译单元对函数进行多种定义,这违反了单定义规则.因此,您将收到编译错误. (链接错误通常类似于:“错误,函数x已在y中定义”)您可以使用inline关键字,而不再违反ODR.

顺便说一下__inline是非标准的.与你的帖子相反,它通常是一个强制内联的编译器扩展,而不是暗示它. inline是标准关键字,最初旨在暗示内联.就像你说的那样,大多数现代编译器在这方面完全忽略了它,现在唯一的目的是给内部联系.

猜你在找的C&C++相关文章