编译器如何处理cpp文件中定义的内联函数

时间:2014-02-13 07:00:50

标签: c++

我们知道在编译之前,调用内联函数会在预处理过程中被其函数体替换。但是,如果内联函数只是在cpp文件中定义的头文件中声明,编译器是否知道如何替换? cimpiler是否只知道内联函数的声明但现在不知道定义?

感谢。

2 个答案:

答案 0 :(得分:3)

内联函数完全由编译器处理,而不是预处理器。

必须在每个使用过度的翻译单元中定义内联函数(§3.2/ 3)。

换句话说,如果在文件中调用内联函数,那么该内联函数的定义(不仅仅是声明)必须出现在该文件的预处理版本中。

违反此规则不需要(当前)诊断。编译器可以完全拒绝代码,或者它可以(例如)继续编译并将该函数视为普通(非内联)函数。你完全受编译器的支配 - 你明显违反了语言的规则,所以唯一真正的问题是编译器是否真的会强制执行规则,或者可能让你逃脱打破它们这个特例。

答案 1 :(得分:0)

  

但是,如果内联函数只是在头文件中声明的话   在cpp文件中定义,编译器是否知道如何替换?

不,它没有。您需要在头文件中包含内联函数定义;如果不这样做,那么当您编译除定义函数之外的文件(但包括标题并尝试调用该函数)时,您将收到链接器错误。

另请注意,内联是由编译器完成的,而不是预处理器。