Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器如何处理cpp文件中定义的内联函数_C++ - Fatal编程技术网

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

C++ 编译器如何处理cpp文件中定义的内联函数,c++,C++,我们知道,在编译之前的预处理过程中,调用内联函数被其函数体替换。但是,如果内联函数只是在头文件中声明,而在cpp文件中定义,编译器知道如何替换吗?cimpiler现在是否只知道内联函数的声明而不知道定义 谢谢。内联函数完全由编译器处理,而不是由预处理器处理 必须在odr使用的每个翻译单元中定义内联函数(§3.2/3) 换句话说,如果文件中有对内联函数的调用,那么该内联函数的定义(而不仅仅是声明)必须出现在该文件的预处理版本中 违反此规则(当前)不需要诊断。编译器可以直接拒绝代码,也可以(例如)继

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


谢谢。

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

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

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


违反此规则(当前)不需要诊断。编译器可以直接拒绝代码,也可以(例如)继续编译并将该函数视为普通(非内联)函数。不过,你几乎要受编译器的摆布——你显然在破坏语言的规则,所以唯一真正的问题是编译器是否真的会执行这些规则,或者在这种特殊情况下可能让你不受破坏。

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

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

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


违反此规则(当前)不需要诊断。编译器可以直接拒绝代码,也可以(例如)继续编译并将该函数视为普通(非内联)函数。不过,你几乎要受编译器的摆布——你显然在破坏语言的规则,所以唯一真正的问题是编译器是否真的会执行这些规则,或者在这种特殊情况下可能让你不受破坏。

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

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

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


违反此规则(当前)不需要诊断。编译器可以直接拒绝代码,也可以(例如)继续编译并将该函数视为普通(非内联)函数。不过,你几乎要受编译器的摆布——你显然在破坏语言的规则,所以唯一真正的问题是编译器是否真的会执行这些规则,或者在这种特殊情况下可能让你不受破坏。

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

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

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

违反此规则(当前)不需要诊断。编译器可以直接拒绝代码,也可以(例如)继续编译并将该函数视为普通(非内联)函数。不过,你几乎要听命于编译器的摆布——你显然违反了语言的规则,所以唯一真正的问题是编译器是否真的会强制执行这些规则,或者在这种特殊情况下可能会让你逃脱违反规则的惩罚

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

不,没有。您需要在头文件中包含内联函数定义;如果不这样做,则在编译定义函数的文件(但包含头并尝试调用函数)以外的文件时,将出现链接器错误

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

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

不,没有。您需要在头文件中包含内联函数定义;如果不这样做,则在编译定义函数的文件(但包含头并尝试调用函数)以外的文件时,将出现链接器错误

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

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

不,没有。您需要在头文件中包含内联函数定义;如果不这样做,则在编译定义函数的文件(但包含头并尝试调用函数)以外的文件时,将出现链接器错误

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

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

不,没有。您需要在头文件中包含内联函数定义;如果不这样做,则在编译定义函数的文件(但包含头并尝试调用函数)以外的文件时,将出现链接器错误


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

据我所知,
inline
更像是对编译器的提示。它并没有说“无论如何都要内联这个函数”,所以它不会产生