|
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 をつけた場所での通用範囲(スコープ)になるということでしょうか。
|