1

クラスにいくつかのメンバー関数があります。インライン指定子を使用すると、コンパイラは未定義の参照について不平を言います。

私が試してみました:

クラスヘッダーファイルのみで関数定義の前に「インライン」を使用します。

クラス .cpp (メンバー関数が指定されている場所) ファイルのみで、関数宣言の前に 'inline' を使用します。

上記の2つを同時に行います。

明らかに、これらの方法の 1 つが正しく、他の方法は正しくありません。ただし、各オプションを試しても、コンパイルされたプログラムは得られませんでした。

これが私がやろうとしていることです:

.hpp ファイル:

class A{
    void func();
}

.cpp ファイル:

... 含む ...

inline void A::func()
{ 
    ...
}

または、「インライン」が他の場所に行くかもしれません。上記で説明したように、考えられるすべての組み合わせを試しました。(今、関数名と引数の後に、キーワード「const」のように、それが必要だと誰かが私に言うのを見てください。)

私が間違っていることについて何か考えはありますか?私は正しい答えが何であるかをグーグルで調べてみましたが、うまくいきませんでした。クラス内の「インライン」関数は問題ですか?

4

2 に答える 2

8

インライン関数は、ヘッダー ファイルで定義する必要があります。関数の定義 (本体) は、その関数を使用しようとするすべての翻訳単位で表示される必要があります。クラス内で直接定義できます。または、コード内、つまりクラスの外で定義することもできます。ただし、ファイルではなくヘッダーファイルにある必要があり.cppます。

ファイルでインライン関数を定義しようとすると.cpp、その.cppファイルでのみ使用できるようになります。他のファイルで使用しようとすると、.cppリンカー エラー (つまり、「未定義の参照」エラー) が発生します。

于 2013-07-09T18:45:13.887 に答える
1

CPPinlineファイル内に何かを入れると、そのファイル内の関数をインライン化できる可能性があります。コンパイラに関数のインライン展開を促したい場合は、CPP ファイルのことを忘れる必要があります。代わりに、hpp ファイルで次のようにします。

class A{
  inline void func();
};

void A::func() {...}

NB いくつかのポイント:

  1. インライン化しても、関数がインライン化されるわけではありません。これはコンパイラへのヒントです。
  2. インライン化される可能性さえあるようにするには、最適化 (gcc では -O3) が必要です。
  3. クラス内で関数を定義すると、暗黙的に inline キーワードが on になります。

    class A{
      inline void func() {
        ...
      }
    };
    

    は、クラス内でインライン宣言され、定義が外部にある上記と同じです。

関数属性を使用してコードをインライン化するように GCC に強制する方法はいくつかありますが、それらを使用するのはあまり良い考えではないため、説明しません。GCC は、各関数のインライン化に関して「最善の」ことを行う必要があります。他のことを強制すると、ほとんどの場合、パフォーマンスが低下します。

于 2013-07-09T19:03:10.353 に答える