C++ 何时完成内联函数体的替换

C++ 何时完成内联函数体的替换,c++,inline,C++,Inline,我正在尝试内联函数。我认为函数体的替换是在预处理时执行的。但事实并非如此。如果我们将内联函数声明为 //--main.cpp--// .... inline void bar(); .... 然后运行g++-E main.cpp,我们就可以看到内联函数而不做任何更改。那么什么时候执行替换体函数呢?函数内联是一个编译时操作。注意,内联不是命令,它是对编译器的请求,编译器可以随意忽略它。例如,大型方法、递归方法、包含循环的方法或其他方法调用通常不是inlined。当编译器执行内联时,它用方法体替换

我正在尝试内联函数。我认为函数体的替换是在预处理时执行的。但事实并非如此。如果我们将内联函数声明为

//--main.cpp--//
....
inline void bar();
....
然后运行g++-E main.cpp,我们就可以看到内联函数而不做任何更改。那么什么时候执行替换体函数呢?

函数内联是一个编译时操作。注意,内联不是命令,它是对编译器的请求,编译器可以随意忽略它。例如,大型方法、递归方法、包含循环的方法或其他方法调用通常不是
inline
d。当编译器执行内联时,它用方法体替换方法调用,有点类似于宏扩展,但这个过程更复杂。编译器不像宏那样盲目地替换方法调用,它必须处理方法的参数

按照标准

A function declaration (8.3.5, 9.3, 11.4) with an inline specifier declares an inline function. The 
inline specifier indicates to the implementation that inline substitution of the function body at the  
point of call is to be preferred to the usual function call mechanism. An implementation is not required  
to perform this inline substitution at the point of call; 
函数内联是一个编译时操作。注意,内联不是命令,它是对编译器的请求,编译器可以随意忽略它。例如,大型方法、递归方法、包含循环的方法或其他方法调用通常不是
inline
d。当编译器执行内联时,它用方法体替换方法调用,有点类似于宏扩展,但这个过程更复杂。编译器不像宏那样盲目地替换方法调用,它必须处理方法的参数

按照标准

A function declaration (8.3.5, 9.3, 11.4) with an inline specifier declares an inline function. The 
inline specifier indicates to the implementation that inline substitution of the function body at the  
point of call is to be preferred to the usual function call mechanism. An implementation is not required  
to perform this inline substitution at the point of call; 

你为什么这么想?这根本不是
inline
的作用。别猜了。验证。您可能在某个地方读到内联函数与定义为宏的函数有些相似。虽然这在有限的意义上是正确的,但宏替换发生在预处理过程中,而内联发生在编译过程中的更晚时间。
inline
与函数内联或预处理器无关。请参阅问答。@Dmitri除非您确实知道应该这样做,否则这样做可能是个糟糕的主意,但大多数编译器也支持强制函数内联的方法。您为什么这样认为?这根本不是
inline
的作用。别猜了。验证。您可能在某个地方读到内联函数与定义为宏的函数有些相似。虽然这在有限的意义上是正确的,但宏替换发生在预处理过程中,而内联发生在编译过程中的更晚时间。
inline
与函数内联或预处理器无关。请参阅问答。@Dmitri除非您确实知道应该这样做,否则这样做可能是个糟糕的主意,但大多数编译器也支持强制函数内联的方法。谢谢您的回答。但是在标准中没有任何关于它的内容。你为什么这么认为?谢谢你的回答。但是在标准中没有任何关于它的内容。你为什么这么认为?