• ベストアンサー

識別子の外部結合について

識別子について調べていてわからないことがあり 質問させて頂きます。 以下のコードの場合変数aは外部結合ですか それとも外部結合以外となるのでしょうか。 識別子の宣言に対し同一ソースファイル内の関数内で その識別子の定義がある場合、その識別子は外部結合か どうかが知りたいのです。 ご存じの方すいませんがよろしくお願いします。 --test.c-- static int a; main() { ・・・ } function1() { a = 1; ・・・ } function2() { a = 1; ・・・ }

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> 以下のコードの場合変数aは外部結合ですか > それとも外部結合以外となるのでしょうか。 内部結合です。 ファイル有効範囲で宣言した関数・オブジェクトの結合は、大雑把にいうと次のような基準で決まります。 ・externが付けば外部結合 ・staticが付けば内部結合 ・externもstaticも付かなければ外部結合 ただし、externもstaticも付かない場合、同一翻訳単位に同名の関数・オブジェクトの宣言があり、そちらにexternまたはstaticが付いているならそれに従います。 具体的には、 int a; static a; とあれば、aは内部結合になります。 > 識別子の宣言に対し同一ソースファイル内の関数内で > その識別子の定義がある場合、その識別子は外部結合か > どうかが知りたいのです。 void f(void) {  static int a;  extern int b;  int c; } とある場合、bは外部結合ですが、他は「結合なし」です。

orp39ds
質問者

お礼

回答ありがとうございました。 返事が遅れてしまいすいませんでした。 とても参考になりました。 また、よろしくお願いします。

その他の回答 (3)

回答No.4

関数の外で定義した変数は、全て静的変数になります。 本来、全て静的変数なので、あえてstaticを付ける必要はありません。 しかし、関数の外で定義した変数は「外部参照可能か、外部参照不可で翻訳単位内(1つのソース内)のみで参照可能か」の2通りがあります。 そこで、この2つを区別する為「静的変数を意味するキーワードstaticを流用」して、 static付き→外部参照不可 static無し→外部参照可 と言う事にしてしまいました。 本当であれば「private」とかって修飾子でも追加して、 private int a; とでも書いたら「外部参照不可」にすれば良かったのですが、staticが流用されてしまった為、外部参照不可にする場合は static int a; と書く事になっています。

orp39ds
質問者

お礼

回答ありがとうございました。 返事が遅れてしまいすいませんでした。 また、よろしくお願いします。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

関数の外で static 属性を付けて定義した変数は、 当該変数の定義を含んでいるソースファイルに 存在するすべての関数からアクセス可能です(ファイルスコープ)。 当該プログラムが当該ソースファイルを含む 複数のソースファイルで構成していて、 当該ソースファイルと同様に他のソースファイルにおいても 関数の外で static int a; と定義した場合、 当該ソースファイルにおける変数 a と 他のソースファイルにおける変数 a とは 別々の領域に確保します。互いのアクセスは不可です。

orp39ds
質問者

お礼

回答ありがとうございました。 返事が遅れてしまいすいませんでした。 また、よろしくお願いします。

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.1

関数外 static はファイルローカルです。 そのファイル外から参照されないグローバル変数は必ず static にしましょう。

orp39ds
質問者

お礼

回答ありがとうございました。 返事が遅れてしまいすいませんでした。 また、よろしくお願いします。

関連するQ&A