const,static,extern作用

2982 ワード

一、constとマクロの違い(面接問題):
  • const概要:以前よく使われていた文字列定数は、一般的にはマクロに抽出されていましたが、アップルはマクロに抽出することをお勧めしません.const定数を使用することをお勧めします.
  • コンパイル時刻:マクロはプリコンパイル(コンパイル前処理)、constはコンパイル段階である.コンパイル検査:マクロはチェックせず、コンパイルエラーを報告せず、置換するだけで、constはコンパイルチェックし、コンパイルエラーを報告する.
  • マクロの利点:マクロはいくつかの関数、方法を定義することができます.constはできません.
  • マクロのデメリット:大量のマクロを使用すると、コンパイル時間が長くなりやすく、毎回再置き換えが必要になります.

  • 二、const作用:制限タイプ
  • constは、右側の変数(基本データ変数p、ポインタ変数*p)
  • を修飾するためにのみ使用される
  • constによって修飾された変数は読み取り専用です.
  • - (void)viewDidLoad {
        [super viewDidLoad];
    
        //     
        int a = 1;
    
        //      
        a = 20;
    
        // const    
        // const:      p
        //          ,const          b
        const int b = 20; // b:    
        int const b = 20; // b:    
    
        //       
        b = 1;
    
        // const:      *p, *   ,      .
        //       int       ,  a   
        int *p = &a;
    
        int c = 10;
    
        p = &c;
    
        //     p     ,
        //     p        
        *p = 20;
    
        // const             ,      *p1,
        //       
        const int *p1; // *p1:   p1:  
        int const *p1; // *p1:   p1:  
    
        // const      p1
        int * const p1; // *p1:   p1:  
    
    
        //    const  *p1    const   p1
        //       
        const int * const p1; // *p1:   p1:  
    
        int const * const p1;  // *p1:   p1:  
    }
    
    

    三、const開発で使用するシーン:
  • 需要1:この方法のパラメータはアドレスで、中はアドレスで値を読み取ることしかできなくて、アドレスで値を修正することができません
  • .
  • 需要2:パラメータがアドレスであり、パラメータのアドレスを変更できない方法を提供する.
  • @implementation ViewController
    
    // const *      ,  *a  
    //       a,    a         
    - (void)test:(const int * )a
    {
    //    *a = 20;
    }
    
    // const *      ,  a  
    //     a   ,    a    
    - (void)test1:(int * const)a
    {
        int b;
        //    
        a = &b;
    
        *a = 2;
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
        int a = 10;
    
        //   1:      ,          ,           ,         。
    
        //         const,         .
        [self test:&a];
    
        //   2:      ,          ,           。
        [self test1:&a];
    }
    @end
    

    四、staticとexternは簡単に使う(一つのものを使うには、まずその役割を理解する)
    staticの役割:
  • 修飾ローカル変数:
  • ローカル変数のライフサイクルを延長すると、プログラムが終了してから破棄されます.
  • ローカル変数は1つのメモリしか生成されず、1回だけ初期化されます.
  • ローカル変数の役割ドメインを変更します.
  • グローバル変数
  • を修飾する
  • は、このファイルにのみアクセスできます.グローバル変数の役割ドメインを変更します.ライフサイクルは
  • に変更されません.
  • グローバル変数の繰り返し定義を避ける
  • externの役割:
  • は、グローバル変数(グローバル静的変数を含む)の値を取得するためにのみ使用され、変数
  • を定義するために使用できません.
  • externの動作原理:現在のファイルでグローバル変数があるかどうか、見つからないかを検索してから、他のファイルを検索します.

  • 五、staticとconstを併用する
  • staticとconstの役割:読み取り専用の静的変数
  • を宣言する
  • 使用シーンの開発:1つのファイルでよく使用される文字列定数、staticとconstの組合せ
  • を使用できます.
    六、externとconstを併用する
  • 開発で使用されるシーン:複数のファイルでよく使用される同じ文字列定数で、externとconstを組み合わせて使用できます.理由:
  • staticとconstの組み合わせ:各ファイルに静的グローバル変数を定義する必要があります.
  • externとconstの組み合わせ:グローバル変数を定義するだけで、複数のファイルが共有されます.

  • 大域定数正規書き方:開発中はすべての大域変数を管理しやすく、通常GlobeConstファイルを作り、中には大域変数を専門に定義し、統一管理しなければならない.そうしないと、プロジェクトファイルは探しにくい.