2012-03-24 10 views
3

ステートメント: "インライン関数を呼び出す前に定義する必要があります。"インライン関数/メソッド

この文は正しいですか?

[EDIT]

問題がドイツ語で本来ある:
インラインFunktionenmüssenVORのihremアウフルーフセインdefiniert。

多分それは誰...

+2

誰かが自分の宿題を作っていない – Rps

+0

私は、テスト中でしたが、これが正しいかどうかはまだ分かりませんでした。 – dudade

答えて

5

は、はい、それは正しいですが、唯一のpartly.It多分再額装正しくは次のように役立ちます:

は「インライン関数は、すべてのtranslation unitで定義する必要があります(必ずしもそうである必要はありません)。

C11 ++標準:§7.1.2.4

インライン関数は、それが使用されるすべての変換単位で定義されるものと 全ての場合において正確に同じ定義を有するもの[注:インライン関数への呼び出しは、その定義が翻訳単位で表示される前に発生する可能性があります。 -end note]

なぜこのような理由がありますか?

関数をインラインで宣言する場合関数を呼び出すコードを、関数が呼び出されたときに関数の内容で置き換えるよう(可能な場合)コンパイラに指示します。その考え方は、関数本体がおそらく小さく、関数を呼び出すことが、関数自体の本体よりオーバーヘッドであるということです。

これを行うには、関数が呼び出されているコードをコンパイルするときにコンパイラが定義を参照する必要があります。通常、これはヘッダの関数定義をinline指定子で追加し、関数が呼び出されるすべてのcppファイルにヘッダファイルを含めることによって行われます。

+2

あなたの引用文に「before」という言葉は表示されません。 –

+0

@DavidGrayson:いいえ、あなたが作ろうとしていた点を得て、それを適切に反映するように編集しました。改善された答えは –

+0

+1です。私はインライン関数のための別の論理的根拠を追加したい:それはコンパイラが関数の本体を最適化することができます。引数の値が何であるかを事前に知っている場合、大きな関数全体を2つの命令に最適化することができます。 –

-1

このステートメントは意味をなさない:インライン化された関数はもはや呼び出されず、コードは現在の関数に単に存在する(インライン化されている)。そうではない、私はそれが正しくないと言うだろう。

+1

コンパイルされたコードが関数呼び出しのように見えなくても、 "foo()"を書くことでインライン関数を "呼び出す"ことができます。あなたは単に「呼び出し」という言葉の人工的に厳密な定義を課しているようです。 –

0

No. C++11 draft n3242 7.1.2サブセクション4の以前の仕様状態よりもはっきりと分かります。

インライン関数は、ODR-使用され、全ての場合 (3.2)で正確に同じドのfi nitionを有するもの たデFiをすべての変換単位で定義さでなければなりません。 [注:翻訳単位に定義されている の前に、インライン関数の呼び出しが発生する可能性があります。 - 最後のノート]

関連する問題