c ++当我不使用内联时,为什么链接会失败?

Tom*_*Tom 1 c++ inline

我有一个内联函数的声明恰好是递归的.因为它是递归的,所以没有必要将其内联声明,所以当我删除它时,为什么我的链接会失败?

3个档案:

\\File1.h

#ifndef FILE1_H
#define FILE1_H

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

int PermutationsNum(int b);


#endif


\\File1.cpp
#include "File1.h"

int PermutationsNum(int b)
{
    return Factorial(b);
}


\\File2.cpp

#include <iostream>
#include "File1.h"

int main()
{
    std::cout << "permutations of 7 elements: " << PermutationsNum(7) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 5

inline告诉编译器不要导出符号.如果不使用它,符号将由包含该文件的所有编译单元导出,从而产生多重定义.

3.2一个定义规则[basic.def.odr]

4)每个程序应包含该程序中每个非内联函数 或变量的一个定义 ; 无需诊断.该定义可以在程序中明确显示,可以在标准或用户定义的库中找到,或者(在适当的时候)隐式定义(见12.1,12.4和12.8).内联函数应在每个使用它的翻译单元中定义.

inline实际上是关键字的唯一相关用法- 实际上内联函数取决于编译器.IMO,关键字在这个意义上甚至不到一个提示.