2012-10-11 16 views
23

インライン関数と静的インライン関数の違いは誰にでも分かりますか?インライン関数と静的インライン関数の違い

インラインで静的インラインを推奨するのはどの場合ですか?

リンク時にコンパイルの問題に直面しているインライン関数があるため(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でのみ行うべきだと思います。

私の関数はヘッダファイルにあるので、静的にすると、スタティック関数がその翻訳単位で使用できるヘッダファイルがどこに含まれているのでしょうか?

+0

この機能はクラス内にありますか?その宣言も投稿してください。 – anatolyg

+1

は静的オブジェクト ':: wizNtrKit'ですか?そのリンケージは何ですか? – Walter

+0

また、関数はどこに表示されますか?ヘッダーファイル、ソースファイル?いくつのソースファイルにそれが含まれていますか? –

答えて

36

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

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

私はこの特定のリンカエラーが発生したことを覚えていませんが、少なくともこれらの制限の1つが原因である可能性があります。要件を満たしているのはあなたの責任です。

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

この違いのため、関数にstaticローカル変数が含まれている場合、それはstaticであるかどうかによって異なった動作をします。それがstaticであるならば、各TUはそれ自身のバージョンの関数を持ち、それゆえローカル変数staticのコピーを持ちます。 inlineのみの場合、すべてのTUで使用されるローカル変数staticのコピーは1つだけです。

+2

注: 'static'関数の場合、' inline'ビットはその意味的意味を失います(*その関数定義複数のTUに現れる*)。インラインに付いている唯一のことは、ほとんど無視しているコンパイラへの単なるヒントです。 –

+0

はい、 'inline'関数について私が言うことは、1つの定義ルールの要件を除いて、' static'でも 'inline'でもない関数宣言にも当てはまります。各TUに同一の定義を要求する代わりに、1つのTUにのみ定義が含まれている必要があります。質問者のコードが 'inline'が削除されたときに動作することを考えれば、ここでは面白いことが起こっていると思われます。複数のTUで定義されているとリンカエラーが発生すると思います。私は診断が必要だとは思わないが、リンカーにとっては難しいことではない。 –

関連する問題