C預處理器

如何使用C預處理器

預處理器是使用C進行編程時對我們有很大幫助的工具。它是C標準的一部分,就像語言,編譯器和標準庫一樣。

它解析我們的程序,並確保編譯器在進行該過程之前獲得了所需的所有內容。

實際上,它是做什麼的?

例如,它會查找您隨附的所有頭文件#include指示。

它還會查看您使用定義的每個常量#define並用其實際值代替。

僅僅是開始,我提到了這兩個操作,因為它們是最常見的操作。預處理器可以做更多的事情。

你注意到了嗎#include#define有一個#一開始?這是所有預處理器指令所共有的。如果一行以#,由預處理器負責。

有條件的

我們可以做的一件事是根據表達式的值使用條件更改程序的編譯方式。

例如,我們可以檢查DEBUG常數為0:

#include <stdio.h>

const int DEBUG = 0;

int main(void) { #if DEBUG == 0 printf(“I am NOT debugging\n); #else printf(“I am debugging\n); #endif }

符號常量

我們可以定義一個符號常數

#define VALUE 1
#define PI 3.14
#define NAME "Flavio"

當我們在程序中使用NAME或PI或VALUE時,預處理器會在執行程序之前將其名稱替換為值。

符號常量非常有用,因為我們可以在編譯時為值命名而不用創建變量。

巨集

#define我們還可以定義一個巨集。宏和符號常量之間的區別在於,宏可以接受參數,並且通常包含代碼,而符號常量是一個值:

#define POWER(x) ((x) * (x))

請注意參數周圍的括號,這是避免在預編譯過程中替換宏時出現問題的一種好習慣。

然後,我們可以像下面這樣在我們的代碼中使用它:

printf("%u\n", POWER(4)); //16

函數的最大區別是宏不指定其參數類型或返回值,這在某些情況下可能會派上用場。

如果定義

我們可以檢查是否使用定義了符號常量或宏#ifdef

#include <stdio.h>
#define VALUE 1

int main(void) {
#ifdef VALUE
  printf("Value is defined\n");
#else
  printf("Value is not defined\n");
#endif
}

我們還有#ifndef檢查是否相反(宏未定義)。

我們也可以使用#if defined#if !defined做同樣的任務。

通常將一些代碼塊包裝成這樣的塊:

#if 0

#endif

暫時阻止其運行,或使用DEBUG符號常量:

#define DEBUG 0

#if DEBUG
  //code only sent to the compiler
  //if DEBUG is not 0
#endif

可以使用的預定義符號常量

預處理器還定義了許多可以使用的符號常量,它們由名稱前後的2個下劃線標識,包括:

  • __LINE__轉換為源代碼文件中的當前行
  • __FILE__轉換為文件名
  • __DATE__轉換為編譯日期,在Mmm gg aaaa格式
  • __TIME__轉換為編譯時間,在hh:mm:ss格式

免費下載我的C手冊


更多clang教程: