質問

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

役に立ちましたか?

解決

これは、物事が定義されている方法です。

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

インライン関数ののみの、そのモジュール(内部結合)で使用される場合。そして、それはそれにそのモジュールの「私的」なものへのアクセスを許可しても安全です。

他のヒント

ファイル スコープを持つオブジェクトまたは関数は、記憶域指定子「static」で宣言され、内部リンケージを持ちます。その有効期間はプログラムの実行全体ですが、内部リンケージを持つオブジェクトは他の翻訳単位に対して宣言されません (つまり、他の翻訳単位から参照できます)。

外部リンケージを備えたインライン関数の場合、コンパイラーは次のことを行う場合があります。

  • に電話する 実例 関数が宣言されている翻訳単位内
  • 呼び出し時点でインライン置換を実行します。
  • 同一だが別個のものを作成する 実例 呼び出し元の翻訳単位内の関数の

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

さらに、「静的保存期間を持つ変更可能なオブジェクトの定義を含めてはなりません」。これにより、そのオブジェクトの複数のインスタンスが発生する可能性があり、おそらく意図した動作ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top