我们知道在编译之前,调用内联函数会在预处理过程中被其函数体替换。但是,如果内联函数只是在cpp文件中定义的头文件中声明,编译器是否知道如何替换? cimpiler是否只知道内联函数的声明但现在不知道定义?
感谢。
答案 0 :(得分:3)
内联函数完全由编译器处理,而不是预处理器。
必须在每个使用过度的翻译单元中定义内联函数(§3.2/ 3)。
换句话说,如果在文件中调用内联函数,那么该内联函数的定义(不仅仅是声明)必须出现在该文件的预处理版本中。
违反此规则不需要(当前)诊断。编译器可以完全拒绝代码,或者它可以(例如)继续编译并将该函数视为普通(非内联)函数。你完全受编译器的支配 - 你明显违反了语言的规则,所以唯一真正的问题是编译器是否真的会强制执行规则,或者可能让你逃脱打破它们这个特例。
答案 1 :(得分:0)
但是,如果内联函数只是在头文件中声明的话 在cpp文件中定义,编译器是否知道如何替换?
不,它没有。您需要在头文件中包含内联函数定义;如果不这样做,那么当您编译除定义函数之外的文件(但包括标题并尝试调用该函数)时,您将收到链接器错误。
另请注意,内联是由编译器完成的,而不是预处理器。