const,static,extern

4825 ワード

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

  • 注意:多くのBlogはすべてマクロを使うと言って、多くのメモリを消耗することができて、私のこの検証は多くのメモリを生成することはできなくて、マクロは定数を定義して、定数はすべて定数区に置いて、1部のメモリだけを生成します.
    //      :   
    #define HMXAccount @"account"
    
    #define HMXUserDefault [NSUserDefaults standardUserDefaults]
    
    //      
    static NSString * const account = @"account";
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        //       
        //    
        [XMGUserDefault setValue:@"123" forKey:XMGAccount];
    
        //   const  
        [[NSUserDefaults standardUserDefaults] setValue:@"123" forKey:account];
    
    }
    
    

    二、const作用:制限タイプ
    *   1.const           (      p,    *p)
    *   2. const         。
    
  • 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.  1:      ,          ,           ,         
    *   2.  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.ローカル変数のライフサイクルを延長し、プログラムが終了してから破棄されます.2.ローカル変数は1つのメモリしか生成されず、一度だけ初期化されます.3.ローカル変数の役割ドメインを変更します.
  • グローバル変数を修飾する1.本ファイルでのみアクセス可能で、グローバル変数の役割ドメインを変更し、ライフサイクルは変更しない2.グローバル変数の繰り返し定義を避ける
  • .
  • extern :
  • は、グローバル変数(グローバル静的変数を含む)の値を取得するためにのみ使用され、変数
  • を定義するために使用できません.
  • extern :
  • 現在のファイルでグローバル変数があるかどうか、見つからないかを検索してから、他のファイルを検索します.

  • //     :      ,      , extern    。
    int a = 20;
    
    // static      
    static int age = 20;
    
    - (void)test
    {
        // static      
        static int age = 0;
        age++;
        NSLog(@"%d",age);
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
    
        [self test];
        [self test];
    
        extern int age;
        NSLog(@"%d",age);
    }
    I
    

    五、staticとconstを併用する
  • staticとconstの役割:読み取り専用の静的変数
  • を宣言する
  • 開発使用シーン: でよく使用される文字列定数はstaticとconstを組み合わせた
  • を使用できます.
    //      static      ,      
    
    //              ,          。
    
    //           ,         ,     。
    
    //                  
    
    //              
    static const int a = 20;
    
    // staic const     :             
    
    // iOS staic const      ,      ,             ,           .
    
    //        key   ,   const  key,  key  ,     。
    static  NSString * const key = @"name";
    
    //    const   *key1,  *key1  ,key1     。
    
    static  NSString const *key1 = @"name";
    
    

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

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