天天看點

黑馬程式員——C語言預處理總結C語言預處理總結 1.預處理  2.宏定義  3.條件編譯4.檔案包含

------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------                           

C語言預處理總結

  所謂預處理是指在進行編譯的第一遍掃描(詞法掃描和文法分析)之前所作的工作。預處理是C語言的一個重要功能, 它由預處理程式負責完成。當對一個源檔案進行編譯時, 系統将自動引用預處理程式對源程式中的預處理部分作處理, 處理完畢自動進入對源程式的編譯。C語言提供提供了宏定義、條件編譯和檔案包含三種預處理指令。合理地使用預處理功能編寫的程式便于閱讀、修改、 移植和調試,也有利于子產品化程式設計。

1.預處理  

     1>預處理都是以#開頭的 

    2>預處理指令主要有三種,分别是  

         (1)宏定義

            (2)條件編譯

            (3)檔案包含

   3>預處理指令在代碼翻譯為0,1之前執行  

   4>預處理指令的書寫位置是随意的,但是預處理指令也有作用域,是從編寫指令的那一行代碼開始一直檔案結束  

2.宏定義  

  2.1  宏定義: #define  宏名 值

    宏名一般大寫,如#define COUNT 5

#include<stdio.h>
#define COUNT 5

int main()
{
 //int ages[COUNT] = {15, 23, 27, 29, 20};
 int ages[COUNT] = {14,22,23,25,11}; 
int i;
 for(i = 0;i<COUNT;i++)
{
  printf("ages[%d] = %d\n",i,ages[i]);
}
 int a = COUNT;
 printf("a = %d\n",a);
 #undef COUNT
 //int b = COUNT;
 //printf("b = %d\n",b);
return 0;
}
           

 從上面的代碼可以看出,定義的宏COUNT 從#define COUNT 一直到#undef COUNT 宏是有效的。用上述的程式周遊數組,會輸出全部的數組元素。在編譯時,編譯器會把所有的COUNT (嚴格意義上來說是從定義到#undef )替換為對應的值,在此處替換5。而本程式的最後兩句會報錯,原因是#udef之後宏定義失效,會提示未定以的變量變量COUNT。  

2.2 宏定義注意

  1>宏名一般用大寫或者以k開頭,變量名一般小寫

  2>宏的在作用域内,一直有效,直到檔案結束或者遇到#undef辨別結束

  3>宏隻是文本的替換并沒有參與運算,在定義有參數的宏時,一定要嚴謹

  4>帶參數的宏定義執行效率高(宏在編譯時直接進行文本替換,而函數實在程式運作時執行的)

<span style="font-size:18px;">#include<stdio.h>
//不嚴謹的宏定義 sum(2+3,1+6) *sum(2+3,1+6) ==2+3+1+6*2+3+1+6
//#define sum(a,b) a+b
#define sum(a,b) ((a)+(b))
#define squar(a) ((a)*(a))
int main()
{
int c = sum(2,5)*sum(3,5);
printf("c = %d\n",c);
int d = squar(3+5+6);
printf("d = %d\n",d);
return 0;
}</span>
           

3.條件編譯

   條件編譯主要有#if 條件,#if defined (條件)#endif以及#if!def  條件 #endif.

3.1第一種條件編譯指令

  文法:

  #if d條件1

    ......code.....

        #elif 條件2

   ........code.....

            ..................

        #elif 條件n

   ........code.....

         #else

   ........code.....

       #endif

最後的#endif不要漏掉,不然會包錯誤,提示沒有}.。

  錯誤提示如下:

  03-條件編譯.c: In function ‘main’:  03-條件編譯.c:34:0: error: unterminated #elif     #if(10==COUNT)    ^  03-條件編譯.c:37:7: error: expected declaration or statement at end of input         }         ^

 由于是預處理指令,這裡的條件是宏定義。

<span style="font-size:18px;">#include<stdio.h>

#define COUNT 5
int main()
{

  #ifdef COUNT
    printf("hahh\n");
  #endif
  
  #ifndef COUNT
   printf("Heheh\n");
  #endif
  /*
 #if defined COUNT
    printf("Haha!\n");
 #endif
 #if !defined COUNT
   printf("Hehehe!\n");
 #endif 
*/                                                              
/*
//int COUNT= 10;
  #if(10==COUNT)
      {
    printf("a = 10\n");
      }
  #elif(5==COUNT)
      {
    printf("a = 5\n");
      }
  #else
      {
    printf("a為其它值\n");
      }
 #endif
*/


/*
03-條件編譯.c: In function ‘main’:
03-條件編譯.c:34:0: error: unterminated #elif
   #if(10==COUNT)
 ^
03-條件編譯.c:37:7: error: expected declaration or statement at end of input
       }
       ^

*/
/*
  int a = 10;
  if(10==a)
      {
    printf("a = 10\n");
      }
  else if(5==a)
      {
    printf("a = 5\n");
      }
  else
      {
    printf("a為其它值\n");
      }
*/


 return 0;
}</span>
           

3.2 #if defined MAX

                      ......code1........

         #endif

       #if !defined Max

                  .....code2.....

       #endif

  假如程式中定義了宏Max則把code1編譯進去,否則編譯code2。

3.3   #ifdef A

             ...code1...

       #endif

    #ifndef A

         .....code2.....

  #endif

  作用和上面的相同,定義宏編譯code1,否則編譯code2。

3.4條件編譯使用注意

  1>條件編譯條件一般為宏

       2>條件編譯寫#if後,一定要加上#endif,不然會報上述的錯誤

4.檔案包含

4.1檔案包含一般用#include指令

  在C語言中,同一檔案可以包含多次,會增加編譯負擔,可以通過和條件編譯指令結合,讓多次同一檔案包含隻編譯一次。代碼如下:

<span style="font-size:18px;"> #ifdef  _STUD_H_

   #define _STUD_H_

  int  sum(int a,int b);

  #endif</span>
           

4.2檔案包含注意

 1>#inlcude後面 <>表示是系統自帶的檔案,""表示是自己定義的檔案

   2>不允許循環包含,如A 包含b,b又包含A

------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------                             

繼續閱讀