C語言中的宏和預處理器
C 預處理器不是編譯器的一部分,而是編譯過程中的一個單獨步驟。簡單來說,C 預處理器只是一個文字替換工具,它指示編譯器在實際編譯之前進行必要的預處理。我們將 C 預處理器稱為 CPP。
所有預處理器命令都以井號 (#) 開頭。它必須是第一個非空白字元,為了可讀性,預處理器指令應從第一列開始。以下部分列出了所有重要的預處理器指令 -
序號 | 指令 & 描述 |
---|---|
1 | #define 替換預處理器宏。 |
2 | #include 從另一個檔案插入特定的標頭檔案。 |
3 | #undef 取消定義預處理器宏。 |
4 | #ifdef 如果此宏已定義,則返回真。 |
5 | #ifndef 如果此宏未定義,則返回真。 |
6 | #if 測試編譯時條件是否為真。 |
7 | #else #if 的替代方案。 |
8 | #elif #else 和 #if 合併成一條語句。 |
9 | #endif 結束預處理器條件。 |
10 | #error 在 stderr 上列印錯誤訊息。 |
11 | #pragma 使用標準化方法向編譯器發出特殊命令。 |
一些預處理器的例子 -
分析以下示例以瞭解各種指令。
#define MAX_ARRAY_LENGTH 20
此指令告訴 CPP 將 MAX_ARRAY_LENGTH 的例項替換為 20。使用 #define 定義常量以提高可讀性。
#include <stdio.h> #include "myheader.h"
這些指令告訴 CPP 從**系統庫**獲取 stdio.h 並將文字新增到當前原始檔中。下一行告訴 CPP 從本地目錄獲取**myheader.h**並將內容新增到當前原始檔中。
#undef FILE_SIZE #define FILE_SIZE 42
它告訴 CPP 取消定義現有的 FILE_SIZE 並將其定義為 42。
#ifndef MESSAGE #define MESSAGE "You wish!" #endif
它告訴 CPP 僅在 MESSAGE 未定義時定義 MESSAGE。
#ifdef DEBUG /* Your debugging statements here */ #endif
它告訴 CPP 在定義 DEBUG 時處理包含的語句。如果您在編譯時向 gcc 編譯器傳遞 -DDEBUG 標誌,這將很有用。這將定義 DEBUG,因此您可以在編譯過程中動態地開啟和關閉除錯。
預定義宏 -
ANSI C 定義了許多宏。儘管每個宏都可用於程式設計,但預定義宏不應直接修改。
序號 | 宏 & 描述 |
---|---|
1 | __DATE__ 當前日期,以“MMM DD YYYY”格式的字元文字表示。 |
2 | __TIME__ 當前時間,以“HH:MM:SS”格式的字元文字表示。 |
3 | __FILE__ 包含當前檔名,以字串文字表示。 |
4 | __LINE__ 包含當前行號,以十進位制常量表示。 |
5 | __STDC__ 當編譯器符合 ANSI 標準時定義為 1。 |
示例
#include <stdio.h> int main() { printf("File :%s\n", __FILE__ ); printf("Date :%s\n", __DATE__ ); printf("Time :%s\n", __TIME__ ); printf("Line :%d\n", __LINE__ ); printf("ANSI :%d\n", __STDC__ ); }
輸出
File :test.c Date :Jun 2 2012 Time :03:36:24 Line :8 ANSI :1
廣告