我有这个文件:

//Q2a.h
#ifndef Q2A_H
#define Q2A_H

inline int MyFactorial(int a)
{
if (a < 2)
    return 1;
return a*MyFactorial(a-1);
}

int NumPermutations(int b);
#endif

//Q2a.cpp
#include "Q2a.h"

int NumPermutations(int b)
{
    return MyFactorial(b);
}

and file with the main- Q2b.cpp

我注意到,当存在递归函数时,编译器通常会忽略内联decle。
但是我的问题是为什么如果删除内联声明,我可以这样做:
g++ -Wall -g -c Q2a.cpp -o Q2a.o
g++ -Wall -g -c Q2b.cpp -o Q2b.o

这些很好,但是在链接阶段:
g++ -Wall -g -c Q2a.o Q2b.o -o Q2

我收到一个错误:MyFactorial(int)的多个定义

最佳答案

因为当您使用#include "Q2a.h"时,实际上是在对内容进行文本替换,因此Q2a.cpp和Q2b.cpp最终都定义了一个名为MyFactorial()的函数。您要么需要使用inline,要么在一个源文件中定义函数。

请注意,使用inline对递归函数无济于事!

关于c++ - 递归内联函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3647428/

10-11 03:33