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++言語を勉強しているシロは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のstaticstatic int age;に変更すると、両方のファイルがコンパイル可能に動作します.したがって、静的グローバル変数は他のファイルで参照できません.
    C言語の宣言と定義の詳細を参照して、externの使用方法のまとめ