前處理器

在 C 編譯器開始編譯原始碼檔案之前,將在預處理階段處理該檔案。此階段可以通過單獨的程式完成,也可以完全整合在一個可執行檔案中。無論如何,在編譯正確開始之前,編譯器會自動呼叫它。預處理階段通過應用文字替換將你的原始碼轉換為另一個原始碼或翻譯單元。你可以將其視為已修改擴充套件的原始碼。該擴充套件源可以作為檔案系統中的真實檔案存在,或者它可以僅在被進一步處理之前短時間儲存在儲存器中。

預處理程式命令以井號(“#”)開頭。有幾個前處理器命令; 其中兩個最重要的是:

  1. 定義

    #define 主要用於定義常量。例如,

    #define BIGNUM 1000000
    int a = BIGNUM; 
    

    int a = 1000000;
    

    #define 以這種方式使用,以避免在原始碼檔案中的許多不同位置顯式地寫出一些常量值。這在以後需要更改常量值時非常重要; 在 #define 中,改變它的次數要小得多,而不是必須在分散在整個程式碼中的多個地方進行更改。

    因為 #define 只進行高階搜尋和替換,所以你也可以宣告巨集。例如:

    #define ISTRUE(stm) do{stm = stm ? 1 : 0;}while(0)
    // in the function:
    a = x;
    ISTRUE(a);
    

    變為:

    // in the function:
    a = x;
    do {
        a = a ? 1 : 0;
    } while(0);
    

    在第一次近似時,此效果與行內函數大致相同,但前處理器不提供 #define 巨集的型別檢查。眾所周知,這容易出錯,使用時需要非常謹慎。

    另請注意,前處理器也會用空格替換註釋,如下所述。

  2. 包括

    #include 用於訪問原始碼檔案之外定義的函式定義。例如:

     #include <stdio.h> 
    

    導致前處理器在編譯之前將 <stdio.h> 的內容貼上到 #include 語句位置的原始碼檔案中。#include 幾乎總是用於包含標頭檔案,這些檔案主要包含函式宣告和 #define 語句。在這種情況下,我們使用 #include 以便能夠使用 printfscanf 等函式,其宣告位於檔案 stdio.h 中。C 編譯器不允許你使用函式,除非之前已在該檔案中宣告或定義; 因此,#include 語句是在 C 程式中重用先前編寫的程式碼的方法。

  3. 邏輯運算

    #if defined A || defined B
    variable = another_variable + 1;
    #else
    variable = another_variable * 2;
    #endif
    

    將更改為:

    variable = another_variable + 1;
    

    如果之前在專案的某個地方定義了 A 或 B. 如果不是這種情況,前處理器當然會這樣做:

    variable = another_variable * 2;
    

    這通常用於在不同系統上執行或在不同編譯器上編譯的程式碼。由於存在全域性定義,即編譯器/系統特定的,你可以在這些定義上進行測試,並始終讓編譯器只使用他將編譯的程式碼。

  4. 評論

    前處理器用單個空格替換原始檔中的所有註釋。評論由//指示直到行的末尾,或者開放/*和結束*/評論括號的組合。