如何使用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教程:
- C編程語言簡介
- C變量和類型
- C常數
- C操作員
- C條件句
- 如何使用C中的循環
- C數組簡介
- 如何在C中確定數組的長度
- C字符串簡介
- 如何在C中查找字符串的長度
- C指針介紹
- 用C遍歷數組
- C中的布爾值
- C函數簡介
- 如何在C中使用NULL
- C語言中的基本I / O概念
- C中的雙引號與單引號
- 如何從C函數返回字符串
- 如何解決C語言中的隱式聲明庫函數警告
- 如何在C中檢查字符值
- 如何在C語言中使用`printf()`打印百分比字符
- C轉換說明符和修飾符
- 如何在C中訪問命令行參數
- C中變量的範圍
- 可以在C中嵌套函數嗎?
- C中的靜態變量
- C全局變量
- C語言中的typedef關鍵字
- C枚舉類型
- C結構
- C頭文件
- C預處理器