6

関数をインライン化すると、リンケージが内部リンケージに変更されますか? 例: 2 つのファイルでインライン関数を使用または呼び出しています。

file1.cpp

//function definition
inline void foo() {}

file2.cpp
//function definition
inline void foo() {}

インライン関数を呼び出すために、各ファイルでインライン関数を定義する必要があるのはなぜですか? 内部リンケージを取得していますか?を使用するとどうなりますstatic inlineか?

4

1 に答える 1

10

関数をインラインにすると、そのリンケージが内部リンケージに変わりますか?

いいえ、インラインにしてもリンクは変わりません。

インライン関数を呼び出すことができるように、各ファイルでインライン関数を定義する必要があるのはなぜですか?

言語がそれを必要とするからです。C ++ 11 7.1.2 / 4は、「インライン関数は、それがodrで使用されるすべての変換単位で定義され、すべての場合でまったく同じ定義を持つ必要があります」と述べています。

内部リンクを取得していますか?

いいえ、まだ外部リンケージがあります。関数へのポインターは、どの変換ユニットでも同じ値になり、関数内で宣言された静的オブジェクトは、どの変換ユニットでも同じオブジェクトになります。

使用するとどうなりますstatic inlineか?

のために、それは内部リンクを与えstaticます。これは、別々の変換単位での定義が、異なるアドレスと静的オブジェクトの別個のコピーを使用して、別々の関数を生成することを意味します。

于 2011-12-22T14:51:09.297 に答える