メモ書き C言語

2006/08/09
■static


ソース

/* test.c */
#include <stdio.h>
#include "func.h"

extern int g_val;

int main(void)
{
    printf("main:g_val:%d\n", g_val);
    func();
    func();
    return 0;
}

/* func.h */
void func(void);

/* func.c */
#include <stdio.h>

int g_val = 123;

void func(void)
{
    int l_val = 3;

    printf("func:g_val:%d\n", g_val);
    printf("func:l_val:%d\n", l_val);
    l_val += 321;
}

実行結果

main:g_val:123
func:g_val:123
func:l_val:3
func:g_val:123
func:l_val:3

まずはstaticなしで。
ソース

/* test.c */
#include <stdio.h>
#include "func.h"

extern int g_val;

int main(void)
{
    printf("main:g_val:%d\n", g_val);
    func();
    func();
    return 0;
}

/* func.h */
void func(void);

/* func.c */
#include <stdio.h>

int g_val = 123;

void func(void)
{
    static int l_val = 3;

    printf("func:g_val:%d\n", g_val);
    printf("func:l_val:%d\n", l_val);
    l_val += 321;
}

実行結果

main:g_val:123
func:g_val:123
func:l_val:3
func:g_val:123
func:l_val:324

ローカル変数をstaticにすることで宣言(初期化)は1度のみになり、値が保持される。
(ローカルスコープのグローバル変数みたいなもの)
ソース

/* test.c */
#include <stdio.h>
#include "func.h"

/* extern int g_val; コンパイルエラー */

int main(void)
{
    /* printf("main:g_val:%d\n", g_val); コンパイルエラー */
    func();
    return 0;
}

/* func.h */
void func(void);

/* func.c */
#include <stdio.h>

static int g_val = 123;

void func(void)
{
    static int l_val = 3;

    printf("func:g_val:%d\n", g_val);
    printf("func:l_val:%d\n", l_val);
    l_val += 321;
}

実行結果

func:g_val:123
func:l_val:3

グローバル変数をstaticにするとこのファイル内だけのスコープであるグローバル変数になる。
ソース

/* test.c */
#include <stdio.h>
#include "func.h"

/* extern int g_val; コンパイルエラー */
int g_val = 789;

int main(void)
{
    printf("main:g_val:%d\n", g_val);
    func();
    return 0;
}

/* func.h */
void func(void);

/* func.c */
#include <stdio.h>

static int g_val = 123;

void func(void)
{
    static int l_val = 3;

    printf("func:g_val:%d\n", g_val);
    printf("func:l_val:%d\n", l_val);
    l_val += 321;
}

実行結果

main:g_val:789
func:g_val:123
func:l_val:3

1つ前の例のような考えでいくと main.c にも func.c の g_val と同じ名称の変数を宣言できる。
(func.c で main.c の g_val を使いたいときは関数を利用するのか?)
ソース

/* test.c */
#include <stdio.h>
#include "func.h"

int main(void)
{
    func1();
    /*  func2();  コンパイルエラー */
    return 0;
}

/* func.h */
void func1(void);
static void func2(void);

/* func.c */
#include <stdio.h>
#include "func.h"

void func1(void)
{
    printf("func1\n");
    func2();
}

static void func2(void)
{
    printf("func2\n");
}

実行結果

func1
func2

関数にも同じ用に使える。staticをつけると外部からは呼べない関数(func2)となる。
つまりは static をつけたものは基本的にグローバル変数、関数で static をつけた場所での通用範囲(スコープ)になるということでしょうか。