解决方法
请记住,在标题中包含某些内容与直接在源文件中键入内容没有什么不同.因此,就编译器而言,在头文件中没有任何区别;它从来不知道它在那里.
因此,当您在头文件中定义一个函数,并将该头文件包含在文件中时,就像您只是直接在文件中键入该函数一样.所以现在问题是,“编译器是否选择基于启发式内联事物?”
答案是“这取决于编译器”.该标准不保证内联或不内联.也就是说,任何现代编译器都会对其内联的内容非常聪明,可能是通过启发式方法.
但是,我们谈到了一个有趣的观点.想象一下,您在标题中有一个函数,并在多个源文件中包含该标题.然后,您将跨翻译单元对函数进行多种定义,这违反了单定义规则.因此,您将收到编译错误. (链接器错误通常类似于:“错误,函数x已在y中定义”)您可以使用inline关键字,而不再违反ODR.
顺便说一下__inline是非标准的.与你的帖子相反,它通常是一个强制内联的编译器扩展,而不是暗示它. inline是标准关键字,最初旨在暗示内联.就像你说的那样,大多数现代编译器在这方面完全忽略了它,现在唯一的目的是给内部联系.