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 1 つの定義規則 [basic.def.odr]

4)すべてのプログラムには、そのプログラムで ODR で使用されるすべての非インライン関数 または変数の定義が 1 つだけ含まれる必要があります。診断は必要ありません。定義は、プログラム内で明示的に表示されるか、標準またはユーザー定義ライブラリーで見つけることができます。または (適切な場合) 暗黙的に定義されます (12.1、12.4、および 12.8 を参照)。インライン関数は、odr が使用されるすべての翻訳単位で定義されます。

実際、これはキーワードの唯一の適切な使用法ですinline-実際に関数をインライン化することはコンパイラー次第です.IMO、キーワードはその意味でヒントよりもさらに少なくなります。

于 2013-01-06T19:27:11.343 に答える