1

我有一个恰好是递归的内联函数的声明。由于它是递归的,因此将其声明为内联毫无意义,那么当我删除它时,为什么我的链接会失败?

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;
}
4

1 回答 1

5

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

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

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

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

于 2013-01-06T19:27:11.343 回答