プロが教える店舗&オフィスのセキュリティ対策術

識別子について調べていてわからないことがあり
質問させて頂きます。

以下のコードの場合変数aは外部結合ですか
それとも外部結合以外となるのでしょうか。

識別子の宣言に対し同一ソースファイル内の関数内で
その識別子の定義がある場合、その識別子は外部結合か
どうかが知りたいのです。

ご存じの方すいませんがよろしくお願いします。

--test.c--
static int a;

main()
{
・・・
}

function1()
{
a = 1;
・・・
}

function2()
{
a = 1;
・・・
}

A 回答 (4件)

関数の外で定義した変数は、全て静的変数になります。



本来、全て静的変数なので、あえてstaticを付ける必要はありません。

しかし、関数の外で定義した変数は「外部参照可能か、外部参照不可で翻訳単位内(1つのソース内)のみで参照可能か」の2通りがあります。

そこで、この2つを区別する為「静的変数を意味するキーワードstaticを流用」して、
static付き→外部参照不可
static無し→外部参照可
と言う事にしてしまいました。

本当であれば「private」とかって修飾子でも追加して、
private int a;
とでも書いたら「外部参照不可」にすれば良かったのですが、staticが流用されてしまった為、外部参照不可にする場合は
static int a;
と書く事になっています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/12/19 18:51

関数の外で static 属性を付けて定義した変数は、


当該変数の定義を含んでいるソースファイルに
存在するすべての関数からアクセス可能です(ファイルスコープ)。

当該プログラムが当該ソースファイルを含む
複数のソースファイルで構成していて、
当該ソースファイルと同様に他のソースファイルにおいても
関数の外で static int a; と定義した場合、
当該ソースファイルにおける変数 a と
他のソースファイルにおける変数 a とは
別々の領域に確保します。互いのアクセスは不可です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/12/19 18:51

> 以下のコードの場合変数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は外部結合ですが、他は「結合なし」です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/12/19 18:50

関数外 static はファイルローカルです。


そのファイル外から参照されないグローバル変数は必ず static にしましょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/12/19 18:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!