スコープ
スコープC言語の変数は、に分かれています。
- Scopeブロック(コードブロックは、{}の間のコードのブロックです)
- 関数スコープ
- ファイルスコープ
ローカル変数
ローカル変数は、自動変数(書き込みに自動書き込み時間)と呼ばれ、{}ブロックの一般的な変数は、以下の特徴を有する自動変数、内部で定義されています。
- 関数内で定義され、関数が範囲内でのみ有効です。
- 複合文で定義されているのみ複合文の中に有効です。
- 宣言では、関数呼び出しの終了または複合文期間のローカル変数も、両端の終了を宣言します
- 初期値なした場合、コンテンツがランダムであります
#include <stdio.h>
void test()
{
//auto写不写是一样的
//auto只能出现在{}内部
auto int b = 10;
}
int main(void)
{
//b = 100; //err, 在main作用域中没有b
if (1)
{
//在复合语句中定义,只在复合语句中有效
int a = 10;
printf("a = %d\n", a);
}
//a = 10; //err离开if()的复合语句,a已经不存在
return 0;
}
スタティック(静的)ローカル変数
- 静的ローカル変数のスコープは、関数の定義に有効です
- 静的ローカル変数のライフサイクルとstaitcローカル変数の値は、一度だけ初期化されますが、複数回割り当てることができますが、同じ周期を実行します
- 数値変数の自動初期値0、文字の文字変数のヌル化:初期値に割り当てられた静的ローカル変数は、システムによって自動的に割り当てられていない場合
#include <stdio.h>
void fun1()
{
int i = 0;
i++;
printf("i = %d\n", i);
}
void fun2()
{
//静态局部变量,没有赋值,系统赋值为0,而且只会初始化一次
static int a;
a++;
printf("a = %d\n", a);
}
int main(void)
{
fun1();
fun1();
fun2();
fun2();
return 0;
}
グローバル変数
- 定義関数の外では、この機能は、ファイルや他のファイル、この変数はexternと宣言する必要があります関数呼び出しの場合は、他のファイルを共有することができます
- ライフサイクルのグローバル変数と同じ周期を実行しています
- 異なるファイルのグローバル変数を複製することはできません
スタティック(静的)グローバル変数
- 関数定義の外で、それは定義された文書として限られた範囲であります
- 異なるファイル静的なグローバル変数は、同じ名前であってもよいが、スコープと競合しないことができます
- ライフサイクルの静的および一度だけしばらくstaitcグローバル変数の初期化値、サイクルを実行しているようなグローバル変数、
externグローバル変数の宣言
extern int a;
他のファイルで定義されている変数を宣言し、ここではそれだけの文ではなく、定義です。
グローバル関数やスタティック関数
C言語の関数では、デフォルトでグローバルである、キーワードの静的関数を使用し、静的な関数は、この関数は、ファイルでのみを使用することができることを静的手段として定義されているとして宣言することができ、この関数を定義した場合でも、他のドキュメントで呼び出すことはできません他の文書では、文はこの機能を使用していませんでした。
Staitcは、異なるファイル中の関数名で同じです。
注意:
- 異なる機能で同じ変数名は、それらがお互いを妨害することなく、異なるオブジェクト、異なる分配ユニットを表すことができます。
- 同じソースファイル、グローバル変数と同じ名前のローカル変数は、芸術、グローバル変数内のローカル変数の役割で機能していないことができます。
- すべての関数は、同じ名前にすることはできませんすべての機能を意味し、デフォルトではグローバルであるが、それはstaitc機能がある場合、その範囲はそのように異なるファイルの静的関数名が同じで、ファイルレベルです。