inline int factorial(int n)
{
if(!n) return 1;
else return n*factorial(n-1);
}
当我阅读this时,我发现如果编译器没有正确处理上面的代码将导致“无限编译”。
编译器如何决定是否内联函数?
发布于 2008-10-10 05:56:48
如果可能的话,AFAIK GCC将在递归函数上做尾部调用消除。但是,您的函数不是尾递归的。
发布于 2008-10-10 05:45:13
编译器创建一个调用图;当检测到调用自身的循环时,函数在某个深度(n=1、10、100,无论编译器调到什么)之后不再内联。
发布于 2008-10-10 05:50:25
请参阅已经给出的答案,了解为什么这通常不起作用。
作为“脚注”,您可以使用template metaprogramming实现您正在寻找的效果(至少对于您正在用作示例的阶乘)。从维基百科粘贴:
template <int N>
struct Factorial
{
enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0>
{
enum { value = 1 };
};
https://stackoverflow.com/questions/190232
复制相似问题