7

Cの場合:内部リンケージを持つ(つまり、静的に宣言された)インライン関数のみが静的ストレージ期間を持つファイルスコープの変数または関数を参照(つまり、アドレスのコピー、読み取り、書き込み、または呼び出し)できるのに対し、他のインライン関数は参照できないのはなぜですか? ?

4

2 に答える 2

5

これが物事の定義方法です。

インライン関数は、呼び出されるモジュールに挿入されます。そのため、定義されているモジュール内のプライベートなものにアクセスすることはできません。

インライン関数がそのモジュールでのみ使用される場合(内部リンケージ)。次に、そのモジュールの「プライベート」なものへのアクセスを許可するのが安全です。

于 2010-03-07T21:45:58.933 に答える
3

ストレージ指定子「static」で宣言されたファイルスコープを持つオブジェクトまたは関数には、内部リンクがあります。その存続期間はプログラムの実行全体ですが、内部リンケージを持つオブジェクトは、他の変換ユニットに対して宣言されません(つまり、そこから表示されます)。

外部リンケージを持つインライン関数の場合、コンパイラーは次のことを行うことができます。

  • 関数が宣言されている変換ユニット内のインスタンスを呼び出します
  • 呼び出しの時点でインライン置換を実行します
  • 呼び出し元の変換ユニット内に、同一であるが別個の関数のインスタンスを作成します

最後の2つのケースでは、内部リンケージを持つオブジェクトは表示されません。したがって、外部リンケージを持つインライン関数は、内部リンケージを持つ識別子を参照できません。

Furthermore, it "shall not contain a definition of a modifiable object with static storage duration" as this could result in multiple instances of that object which is probably not the intended behavior.

于 2011-06-22T05:02:15.037 に答える