2012-02-16 10 views
16

標準はfooinline function with external linkageあることなぜインライン関数はデフォルトで外部リンケージを持っていますか?

inline void foo(); 

の宣言を与えられたと述べている(デフォルトですべての関数宣言は、外部結合を持っているので)。これは私を奇妙に襲う。 1つの定義ルールセクション3.2(C++ 03とC++ 11の両方)は、次のように述べています。

3 ...インライン関数は、使用されるすべての変換単位で定義されます。

5外部リンケージ(7.1.2)を持つ[n] ...インライン関数の複数の定義があります...複数の変換単位で定義されたDという名前のエンティティDの定義は同じトークンシーケンスで構成されます。

これは、外部リンケージ(つまり、翻訳単位)を介して関数を使用すると、インライン関数も内部リンケージを持つ可能性があることを意味します。定義されていない振る舞い(第3項による)を呼び出すこと、およびすべての翻訳単位におけるインライン関数の内容が同じである必要があること。

このルールの下位互換性または特定のツールチェーンの理由はありますか?

+0

私は[this](http://www.glenmccl.com/ansi_015.htm)が質問に答えると信じています。 –

+0

@Als:これは落とし穴を説明していますが、その変更が行われた理由はありません。 –

+0

これを完全に読んだら、次のように述べています。「この変更のための即時の動機付けは、同じ会議で採用された新しいテンプレートコンパイルモデルの必要性でしたが、より一般的に、デフォルトを変更することは、この変更はANSIとISOの両方で全会一致で承認されました。 –

答えて

17

その結果、インライン関数内で定義された静的変数は、関数のすべてのインスタンス化で共有されることになります。デフォルトが内部リンケージであった場合、各翻訳単位は静的変数の独自のコピーを取得することになります。これは、人々が動作することを期待する方法ではありません。インラインと非インラインは、コードのセマンティクスに大きな影響を与えるべきではありません。

9

これは、ジョナサンシリングの記事Extern Inlines By Defaultによってここで適切に回答されています。この変更の動機について彼を引用する

この変更のための即時の動機は同じ会議で採択された新しいテンプレートコンパイルモデルの必要性でした。より一般的には、デフォルトを変更することは時代遅れのアイデアであり、その変更はANSIとISOの両方で全会一致で承認されたと感じられました。

関連する問題