1. 程式人生 > >C語言(預處理)

C語言(預處理)

- 預處理

在程式編譯之前進行的處理,所有的編譯預處理命令以#開頭。分為巨集定義、檔案包含、條件編譯。


1. 巨集

巨集定義的作用是某段程式碼的別名,以#define開頭,結尾不用分號。
eg:#define PI 3.14//巨集名一般用大寫字母
在編譯預處理時,只是簡單的替換。巨集名的有效範圍是從定義位置到檔案結束。如需終止巨集定義的作用域,可以用#undef命令。
eg:#define PI 3.14
//......
#undef PI

若已定義的識別符號在字串中出現,則不替換。
eg:

這裡寫圖片描述

  1. 無參巨集:上述為無參巨集
    #define R 2.0

    #define PI 3.14
    #define L 2*PI*R//可以在巨集定義的時候引用已定義的巨集
    1. 有參巨集:#define S(a,b) a*b
      S(1+2,3);//表示式替換成a+b*3
      #define S(a,b) (a)*(b)//此時S(1+2,3)將替換成(1+2)*3
      注:有參巨集定義時,巨集名與引數間不能有空格,否則將空格後
      字元替換成巨集名(成為無參巨集)。

2.檔案包含

將指定的檔案內容嵌入到指定原始檔中,包括兩種方式。

  1. #include"xxx.x"//通用方式。此方式一般包含自己寫的檔案,即先在原始檔所在目錄中查詢要包含的檔案,若未能找到則按標準方式查詢。
  2. #include<xxx.x>//標準方式。此方式只在c語言編譯器的c函式庫標頭檔案中查詢要包含的檔案。

3.條件編譯

  1. #ifdef 巨集名 /*程式段1*/判斷某個巨集是否被定義, 若已定義, 執行隨後的程式段1(類似於if判斷語句)。
  2. #else/*程式段2*/if判斷後,若巨集未定義則執行程式段2。
    eg:#define PI 3.14
            #ifdef PI
          程式段1

            #else
          程式段2
         此時執行程式段1。
      
  3. #ifndef 巨集名 /*程式段1*/r若巨集名沒有被定義則執行程式段1
      
  4. #endif 為#if, #ifdef, #ifndef這些條件命令的結束標誌。