2

セクション(6.2.2 / 7)からC99標準

7.翻訳ユニット内で、内部リンケージと外部リンケージの両方で同じ識別子が表示される場合、動作は定義されていません。

以下は、定義の競合のためにコンパイル時エラーを生成しますが

// 'x' has external linkage
extern int x;

// Here, 'x' has internal linkage
static int x;

しかし、以下はうまくコンパイルされます、

// 'x' has external linkage
extern int x;

void foo() {
  // Here, 'x' has internal linkage
  static int x;
}

どちらの場合も未定義の動作を引き起こしますか?

4

2 に答える 2

3

あなたの質問は、ローカルで宣言された静的変数が内部リンケージを持っているという誤った仮定から生じています。実際には、ブロックスコープで宣言された静的変数にはリンケージがありません。6.2.2/6を参照

6次の識別子にはリンクがありません。オブジェクトまたは関数以外のものであると宣言された識別子。関数パラメーターとして宣言された識別子。ストレージクラス指定子externなしで宣言されたオブジェクトのブロックスコープ識別子。

ファイルスコープ宣言のみが外部または内部リンケージ(およびローカルextern宣言)を持つことができます。

したがって、6.2.2/7とあなたの質問は単に当てはまりません。

于 2012-11-25T06:33:19.443 に答える
1

私の知る限りでは、2つの変数が同じではないため、そうではありません。ローカル変数はグローバル変数よりも優先され、のスコープではfoo()1回だけ宣言されます。アセンブラの出力を参照してください。コンパイラは、2つの変数を2つの異なるシンボルに変換する可能性があります。

于 2012-11-25T06:26:23.570 に答える