0

モジュール (翻訳単位) のセットがある場合、シンボルは 2 つの方法でリンクできます。

  1. 「ローカル」リンク - エクスポートされた特定のシンボル「a」を適切なモジュール m1 にリンクし、別のモジュールからの他の特定のシンボル「a」を他の適切なモジュール m2 にリンクできます。このリンク方法では、2 つのモジュールが同じシンボル名を使用していても衝突はありません。同じモジュールにリンクしてはいけません。

  2. 「グローバル」リンク - リンク時にすべてのシンボル名が 1 つのバッグにスローされます。それはシンボル空間の汚染を引き起こし、それは必要ありません(私はそれをCリンクシステムの「設計上のバグ」と考えています)

C言語はおそらく「グローバル」リンクを強制しませんが、リンカはAFAIKを行います

質問が適切であることを願っています。それは c 言語に関するもので、「C 言語はリンクのグローバルな方法を強制するかどうか」が明確です。

//編集

C99がそれを課すと以下に述べました。答えはTNX。

最初のc標準もそれを課しましたか? ここでオリジナルのcクリエイターの意図について非常に興味があります。(私が言ったように、グローバルリンクはC言語では悪い選択だと考えています)

4

3 に答える 3

5

C99 §6.2.2識別子のリンクから

プログラム全体を構成する翻訳単位とライブラリのセットでは、外部リンケージ を持つ特定の識別子の各宣言は、同じオブジェクトまたは関数を示します。1 つの翻訳単位内で、内部リンケージを持つ識別子の各宣言は、同じオブジェクトまたは関数を表します。リンクのない識別子の各宣言は、一意のエンティティを示します。

外部リンケージを持つシンボルについて話しているので、いいえ、プログラム全体でそのようなものを複数持つことはできません。

提案された「ローカルリンク」に関しては、まったく同じ名前のものが複数ある場合、コンパイラまたはリンカーはどのシンボルをバインドするかをどのように知るのでしょうか?

于 2012-09-30T10:33:28.880 に答える
1

C の識別子には、次の 3 つのタイプのリンケージのいずれかが関連付けられています。

  1. internalで宣言された場合static。同じ翻訳単位でのみ参照できます。
  2. externalで宣言されている場合extern(これはデフォルトでもあります)。プログラムを構成する任意の翻訳単位で参照可能
  3. none、それらがリンクの一部ではない場合 (マクロ、自動変数、型名など)

それでおしまい。それは何らかの形であなたが言及していることをしませんか?

于 2012-09-30T10:51:59.513 に答える
0

C 標準は、モジュール/動的ライブラリについて何も述べていません。これらは、ELF などの他の標準でカバーされています。したがって、複数のモジュール/動的ライブラリを使用している限り、ISO C の領域外になります。小さな組み込みシステム用の C コンパイラは、モジュールを気にする必要はありません。

于 2012-09-30T11:24:22.090 に答える