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

时间:2013-01-06 19:26:13

标签: 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;
}

1 个答案:

答案 0 :(得分:5)

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

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

  

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

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