31

インライン関数と静的インライン関数の違いを教えてください。

どのような場合に、インラインよりも静的インラインを優先する必要がありますか?

リンク中にコンパイルの問題に直面しているインライン関数があるため、この質問をしています ( relocation error:... symbol has been discarded with discarded section ...)。私はそれを通常の機能にしましたが、うまくいきました。今、私の先輩の何人かが静的インラインを試してみるように言いました。以下は私の機能です:

inline void wizSendNotifier (const char* nn_name, bpDU* arg=0, int aspect = -1)
{
   wizuiNotifier* notifier = ::wizNtrKit.getNotifier (nn_name);
   notifier->notify (arg, aspect);
}

これはクラス内ではありません。これはヘッダーファイルの中にあります!

静的関数の呼び出しは、それが定義されている特定の TU でのみ行う必要があると思います。

私の関数はヘッダー ファイルにあり、それを静的にすると、そのヘッダー ファイルをインクルードする場所で、静的関数をその翻訳単位で使用できるようになりますか?

4

1 に答える 1

44

非静的inline関数宣言は、それを使用するすべての翻訳単位 (ソース ファイル) で同じ関数を参照します。

One Definition Rule では、関数定義の本体が、それを含むすべての TU で同一であり、「同一」の長い定義が必要です。staticこれは通常、すべてのソース ファイルが同じヘッダーを使用し、関数が内部リンケージ (関数を含む) を持つグローバル名または異なる TU で異なって定義されたマクロを使用しないという条件で満たされます。

以前にその特定のリンカー エラーに遭遇したことは覚えていませんが、少なくともこれらの制限のいずれかが原因である可能性があります。要件を満たすのはあなたの責任です。そうしないと、診断が不要な未定義の動作になります。

関数宣言は、static inlineたまたま同じ名前を持つ、各翻訳単位の異なる関数を参照します。TU ごとに異なるグローバル名またはマクロを使用できますstatic。その場合、ヘッダー ファイル内の定義が「同じに見える」場合でも、TU ごとに関数の動作が異なる可能性があります。

この違いにより、関数にstaticローカル変数が含まれている場合、それが含まれているかどうかによって動作が異なりstaticます。そうである場合static、各 TU には独自のバージョンの関数があり、staticローカル変数の独自のコピーがあります。inline唯一の場合static、すべての TU で使用されるローカル変数のコピーは 1 つだけです。

于 2012-10-11T09:27:43.910 に答える