【黒馬プログラマー】iOS学習の道——C言語のマクロ定義、条件コンパイルと条件含みとtypedef

11079 ワード

---Javaトレーニング、Androidトレーニング、iOSトレーニング、.Netトレーニング、ご交流をお待ちしております!------
一、前処理指令の概要
1.C言語は、ソースプログラムをコンパイルする前に、いくつかの特殊な前処理命令(例えば、以前使用していた#includeファイルに命令が含まれている)を解釈し、新しいソースプログラム(このプロセスをコンパイル前処理と呼ぶ)を生成し、その後、通常のコンパイルを行う.
2.前処理命令と一般的なC文を区別するために、すべての前処理命令は記号「#」で始まり、最後にセミコロンを使わない
3.前処理命令は、プログラムの任意の場所に表示され、その作用範囲は、その出現位置からファイルの最後までである.ソース・プログラムの先頭にできるだけ前処理命令を書くことに慣れています.この場合、その役割範囲はソース・プログラム・ファイル全体です.
4.C言語で提供される前処理命令は主にマクロ定義、ファイル含む、条件コンパイルである.
二、パラメータを持たないマクロ定義
1.    
#define       

   #define ABC 10

           ,  #define ABC

 

2.  
            ,       "  "      "   ",       。

                 

#include 

//          PI            3.14   
#define PI 3.14

//        radius   
float girth(float radius) {
    return 2 * PI *radius;
}

int main ()
{
    float g = girth(2);
    
    printf("   :%f", g);
    return 0;
}

  4       PI  ,        , 8   2 * PI *radius    2 * 3.14 * radius。

3.       
1>          ,          ,           

2>                    ,         。  :


#define R 10
int main ()
{
    char *s = "Radio";
    return 0;
}

  1       R  ,   4  "Radio"   'R'       10

3>                ,      ,          。                          

#define I 100
int main ()
{
    int i[3] = I;
    return 0;
}

          ,       , 4  I      100。            4   。

4>                   。             ,   #undef  

#define PI 3.14
/*
.
.
.
.
*/
#undef PI

PI     1   8       , 8      

5>                  
#define R  3.0
#define PI 3.14
#define L  2*PI*R
#define S  PI*R*R
三、パラメータ付きマクロ定義
1.    
#define   (    )    
2.  
       ,               ,                             
#include 
#define average(a, b) (a+b)/2
int main ()
{
    int a = average(10, 4);
    
    printf("   :%d", a);
    return 0;
}
  3         2     average, 7        :int a = (10 + 4)/2;,     :。              ?
3.    
1>               ,                     
#define average (a, b) (a+b)/2
int main ()
{
    int a = average(10, 4);
    return 0;
}
   1     ,  average (a, b)       ,  , 5       :
int a = (a, b) (a+b)/2(10, 4);
           
2>          ,             ,         。       ,                。
       D(a),     a 2   :
                 
#include 
#define D(a) 2*a
int main ()
{
    int b = D(3+4);
    
    printf("%d", b);
    return 0;
}
 7      int b = 2*3+4;,    :
                ,     3   :
#define D(a) 2*(a)
     a     , 7      int b = 2*(3+4);,    :
3>              
       P(a),     a   :
             
#include 
#define Pow(a) (a) * (a)
int main(int argc, const char * argv[]) {
    int b = Pow(10) / Pow(2);
    
    printf("%d", b);
    return 0;
}
   3 ,            ,         。 6       :
int b = (10) * (10) / (2) * (2);
    :int b = 10 * (10 / 2) * 2;,    b :
            
     3     :
#define Pow(a) ( (a) * (a) )
   6     :
int b = ( (10) * (10) ) / ( (2) * (2) );
    :int b = (10 * 10) / (2 * 2);,      :。           。
5.      
           ,       ,               。           :

1>              、      、    、     

2>             ,               。                   
四、条件コンパイル
      ,                             ,       (                ),       。

 、    


#if   1
 ...code1...
#elif   2
 ...code2...
#else
 ...code3...
#endif

1>     1  ,        #if   #elif   code1      (  :     ,    ,     if-else     )
2>     1   、  2  ,        #elif   #else   code2      

3>     1、2    ,        #else   #endif   code3    

4>   ,       ,        #endif,       (        )

5> #if   #elif                    ,                ,            ,            、       


 、    

#include 

#define MAX 11

int main ()
{
#if MAX == 0
    printf("MAX 0");
#elif MAX > 0
    printf("MAX  0");
#else
    printf("MAX  0");
#endif
    return 0;
}

  3       MAX,        MAX            ,          ,   main     。   7  13        。
  MAX 11,  #elif     , 10          ,               :


/*stdio.h          #include    */

int main ()
{
    printf("MAX  0");
    return 0;
}

        ,    :

 、    

1.#if defined() #if !defined()   
#if   #elif                 ,             。  :

#if defined(MAX)
    ...code...
#endif
         MAX   ,  code    。    MAX     ,     MAX,     。

       :

#if !defined(MAX)
    ...code...
#endif
         MAX   ,  code    。

 

2.#ifdef #ifndef   
* #ifdef    #if defined()       

#ifdef MAX
    ...code...
#endif
         MAX   ,  code    。

* #ifndef  #if !defined()       

#ifndef MAX
    ...code...
#endif
         MAX   ,  code    。
五、ファイルは含む
 、    

                  ,   #include,                     。


 、    

1. 1   #include 
   C                  


2. 2    #include "   "
               ,    ,       path     ,    C               


 、    

1.#include        ,  a.h  b.h,b.h  c.h,         ,   a.h    b.h,b.h    a.h。


2.  #include                ,      


 one.h      one  ; two.h    one.h,       two  。(           ,        )

     main.c   one two    ,             two.h    one.h,        :

       main.c       :

void one();
void one();
void two();
int main ()
{

    return 0;
}

 1   #include "one.h"   , 2、3   #include "two.h"   (  two.h     one.h)。     ,one      2 ,       ,         。

                   ,             :

  

        ,  one.h  :      #include "one.h" ,      _ONE_H_,   9      ,    10    _ONE_H_   ,   13   one  ,   15       。    #include "one.h",         _ONE_H_   ,   9       ,     15  #endif,      。       3   ,   one.h        。

     ,main.c  :

#include "one.h"
#include "two.h"
    :


// #include "one.h"
#ifndef _ONE_H_
#define _ONE_H_

void one();

#endif

// #include "two.h"
#ifndef _TWO_H_
#define _TWO_H_

// #include "one.h"
#ifndef _ONE_H_
#define _ONE_H_

void one();

#endif

void two();

#endif

 2~ 7  #include "one.h"   , 10~ 23  #include "two.h"   。           :

void one();
void two();
          
六、typedefキーワード
 、typedef    

      typedef                 (  )。


#include 

typedef int Integer;
typedef unsigned int UInterger;

typedef float Float;

int main(int argc, const char * argv[]) {
    Integer i = -10;
    UInterger ui = 11;
    
    Float f = 12.39f;
    
    printf("%d  %d  %.2f", i, ui, f);
    
    return 0;
}

   3、 4、 6    int、unsigned int、float     ,   main           ,                。    :

  ,       ,   int、float         :

int i = 10;

float f = 10.0f;
 

*                 

typedef int Integer;

typedef Integer MyInteger;
 

 、typedef   

              ,typedef         


#include 

typedef char *String;

int main(int argc, const char * argv[]) {
    //    char *str = "This is a string!";
    String str = "This is a string!";
    
    printf("%s", str);
    
    return 0;
}

  3     char *    String,    7   String        ,     Java   ?


 、typedef    

                 

1.             

//        
struct MyPoint {
    float x;
    float y;
};

int main(int argc, const char * argv[]) {
    //        
    struct MyPoint p;
    p.x = 10.0f;
    p.y = 20.0f;
    
    return 0;
}

     ,             struct   ,  9 

 

2.  typedef       

//        
struct MyPoint {
    float x;
    float y;
};

//    
typedef struct MyPoint Point;

int main(int argc, const char * argv[]) {
    //        
    Point p;
    p.x = 10.0f;
    p.y = 20.0f;
    
    return 0;
}

    8     MyPoint       Point,   12   Point          p,     struct    

   1~ 8         :

//        ,     
typedef struct MyPoint {
    float x;
    float y;
} Point;
           :

typedef struct {
    float x;
    float y;
} Point;

 、typedef         

typedef     、      ,                 

#include 

//            
typedef struct {
    float x;
    float y;
} Point;

//    
typedef Point *PP;

int main(int argc, const char * argv[]) {
    //        
    Point point = {10, 20};
    
    //       
    PP p = &point;
    
    //              
    printf("x=%f,y=%f", p->x, p->y);
    return 0;
}

  4         ,        Point, 10               PP。   main      2   。

    :

 、typedef     

  typedef                。


//       
enum Season {spring, summer, autumn, winter};
//         
typedef enum Season Season;

int main(int argc, const char * argv[]) {
    //       
    Season s = spring;
    
    return 0;
}

  2        ,  4      Season,    8             ,     enum    。

 1 ~ 4        :

//       ,     
typedef enum Season {spring, summer, autumn, winter} Season
           ,   :

typedef enum {spring, summer, autumn, winter} Season;

 、typedef        

1.            

#include 

//     sum  ,  a b  
int sum(int a, int b) {
    int c = a + b;
    printf("%d + %d = %d", a, b, c);
    return c;
}

int main(int argc, const char * argv[]) {
    //       sum       p
    int (*p)(int, int) = sum;
    
    //       p  sum  
    (*p)(4, 5);
    
    return 0;
}

*   4      sum  , 12        sum       p,    ,      p                 ,     。

*  15    p   sum  ,    :

 

2.           ,      typedef             


#include 

//     sum  ,  a b  
int sum(int a, int b) {
    int c = a + b;
    printf("%d + %d = %d", a, b, c);
    return c;
}

typedef int (*MySum)(int, int);

int main(int argc, const char * argv[]) {
    //       sum       p
    MySum p = sum;
    
    //       p  sum  
    (*p)(4, 5);
    
    return 0;
}

*   10 ,   :          ,      MySum,        2 int     ,    int  。

*   14      MySum      sum       p,           。 17          。


 、typedef #define

1.                (       1   )

*  1 


typedef char *String;

int main(int argc, const char * argv[]) {
    String str = "This is a string!";
    return 0;
}

*  2 


#define String char *

int main(int argc, const char * argv[]) {
    String str = "This is a string!";
    return 0;
}

          1      ,          :        "This is a string!"。

             :

 1     typedef char *     String
 2     char *        String
        ,      typedef #define   。

 

2.       

typedef char *String1;

#define String2 char *

int main(int argc, const char * argv[]) {
    String1 str1, str2;
    
    String2 str3, str4;
    return 0;
}

 1  char *     String1, 2     String2。    6、 8    4   。

    ,  :      ,  str1、str2、str3    char       ,str4   char     。

 

          :

*         int     ,       :

int a, b;
        :

int a;
int b;
*     

typedef char *String1;
    
String1 str1, str2;
  typedef   ,String1         ,   3      

String1 str1;
String1 str2;
  String1  char *,           

char *str1;
char *str2;
 

*          

#define String2 char *

String2 str3, str4;
             , char *  String2,   3      

char * str3, str4;
       :

char * str3;
char str4;
    ,  str4       ,str1、str2、str3      。

  ,        ,    typedef,     #define