C/C++のexternとstatic
4273 ワード
目次1 extern概念 2 extern作用 2.1変数宣言 2.2変数定義 2.3宣言および定義例 3なぜextern を使用するのか4 externの使い方 4.1基本データ型定義変数 4.2カスタムタイプ定義変数 5 static 5.1オブジェクト向けstatic 5.1.1局所静的変数 5.1.2グローバル静的変数
本編の博文は主に自分の浅い理解を記録し、同時に私と同じように勉強している仲間を助ける.皆さん、文の中の不適切な点を指摘してください.ありがとうございます.C/C++言語を勉強しているシロは
1 externコンセプト
2 extern作用
2.1変数宣言
宣言:変数のタイプと名前をプログラムに示すために使用されます.メモリ領域を割り当てないことを宣言します.
2.2変数定義
定義:変数にメモリ領域を割り当て、変数に初期値を割り当てることもできます.
変数には複数の宣言がありますが、1回のみ定義定義がある場合も宣言です.ただし、
2.3宣言と定義例
(1)初期化されていない
例えばa.c,b.cの2つのソースファイルと1つのc.hヘッダファイルがあり、1つの変数がa.c,b.cの複数のソースファイルで同時に使用される場合、変数をヘッダファイルc.hで定義すると、各*.cファイルにc.hというヘッダファイルが含まれ、コンパイラは変数の複数回定義のエラーを提示します.どうやってこの間違いを避けるのか、
4 externの使い方
4.1基本データ型定義変数
基本データ型で変数を定義する場合は、1つのソースファイルでこの変数を定義するだけで、他のソースファイルでこの変数を使用する場合は
a.cで定義した変数b.cで使用する
カスタム変数、例えば構造体、構造体が一般的にヘッダファイルで定義されている場合、2つのソースファイルにはこのヘッダファイルが含まれます.たとえば:
5.1オブジェクト向けstatic
5.1.1局所静的変数
C言語の宣言と定義の詳細を参照して、externの使用方法のまとめ
本編の博文は主に自分の浅い理解を記録し、同時に私と同じように勉強している仲間を助ける.皆さん、文の中の不適切な点を指摘してください.ありがとうございます.C/C++言語を勉強しているシロは
extern
に慣れていないと信じています.自分の勉強によって、extern
に関する知識をみんなと交流してください.1 externコンセプト
extern
はC/C++のキーワードであり、主に変数と関数についてである.ここでは変数のみについて説明します.2 extern作用
extern
外部変数を宣言するために使用されます.ここまで言うと、声明と定義の2つの概念を言わざるを得ない.2.1変数宣言
宣言:変数のタイプと名前をプログラムに示すために使用されます.メモリ領域を割り当てないことを宣言します.
2.2変数定義
定義:変数にメモリ領域を割り当て、変数に初期値を割り当てることもできます.
変数には複数の宣言がありますが、1回のみ定義定義がある場合も宣言です.ただし、
extern
宣言は定義ではなく、メモリ領域も割り当てられません.extern
変数に初期値を割り当てない限り定義です.2.3宣言と定義例
(1)初期化されていない
int i; // , ,
extern int i; // ,
(2)初期化extern int i = 666; // ,
3なぜexternを使うのか例えばa.c,b.cの2つのソースファイルと1つのc.hヘッダファイルがあり、1つの変数がa.c,b.cの複数のソースファイルで同時に使用される場合、変数をヘッダファイルc.hで定義すると、各*.cファイルにc.hというヘッダファイルが含まれ、コンパイラは変数の複数回定義のエラーを提示します.どうやってこの間違いを避けるのか、
extern
が出場するはずだ.1つのソースファイルでこの変数を定義し、他のソースファイルがこの変数を使用する場合、extern
でこの変数を外部変数として宣言します.4 externの使い方
4.1基本データ型定義変数
基本データ型で変数を定義する場合は、1つのソースファイルでこの変数を定義するだけで、他のソースファイルでこの変数を使用する場合は
extern
でこの変数を外部変数として宣言します.たとえば:a.cで定義した変数b.cで使用する
/*a.c*/
#include
int age;
int main()
{
age = 18;
printf("I am %d years old", age);
return 0;
}
/*b.c*/
#include
extern int age; //
int main()
{
age = 19;
printf("I am %d years old", age);
return 0;
}
4.2カスタムタイプ定義変数カスタム変数、例えば構造体、構造体が一般的にヘッダファイルで定義されている場合、2つのソースファイルにはこのヘッダファイルが含まれます.たとえば:
/*a.h*/
#pragma once
typedef struct _student
{
char name[20];
int age;
}student;
/*a.c*/
#include
#include"a.h" //
student stu;
int main()
{
stu->age = 18;
printf("I am %d years old", stu->age);
return 0;
}
/*b.c*/
#include
#include"a.h" //
extern student stu;
int main()
{
stu->age = 19;
printf("I am %d years old", stu->age);
return 0;
}
5 static static
は、静的変数を定義するために使用される.グローバル変数を修飾することもできるし、ローカル変数を修飾することもできる.プロシージャ向けプログラミングにも、オブジェクト向けプログラミングにも使用できます.プロシージャ向けとオブジェクト向けではstatic
キーワードが使用されます. static
修飾静的変数は、グローバル静的変数でもローカル静的変数でもグローバルデータ領域に配置される.5.1オブジェクト向けstatic
5.1.1局所静的変数
static
ローカル変数の修飾:このローカル静的変数のライフサイクルはプログラムの実行中に有効であり、すべてのファイルにアクセスできます.例://example
#include
int func(int a)
{
static int c = 2;
c += a;
return c;
}
int main()
{
int a = 1, b;
b = func(a++);
printf("b:%d", b);
b = func(a++);
printf("b:%d", b);
return 0;
}
関数内で変数を定義します.変数の役割ドメインは、プログラムが文に実行されるとスタックにメモリが割り当てられ、関数が実行されると、変数のメモリが自動的に解放されるため、関数の1回の実行に限られます.このように、2回目の使用変更量が1回目の使用に基づいている場合、問題が発生します.この問題は、static
キーワード修飾変数がグローバルデータ領域に格納され、従来の技術でこのローカル静的変数を使用することができることにも言及した. :
1 ;
2 , ;
3 , , 0;
4 , 。 , , 。
5.1.2グローバル静的変数static
グローバル変数を修飾する:このグローバル静的変数の役割ドメインは本ファイルに限られ、他のファイルはアクセスできません.つまり、他のファイルで同じ名前の変数を定義し、コンパイラはエラーを報告しません.たとえば:/*file1*/
#include
static int age; //
int main()
{
age = 19;
printf("I am %d years old", age);
return 0;
}
/*file2*/
#include
extern int age; //
int main()
{
age = 19;
printf("I am %d years old", age);
return 0;
}
この2つのファイルのコンパイルは問題ありませんが、実行中にエラーが発生します.file 1のstatic
をstatic int age;
に変更すると、両方のファイルがコンパイル可能に動作します.したがって、静的グローバル変数は他のファイルで参照できません.C言語の宣言と定義の詳細を参照して、externの使用方法のまとめ