前言:
爲了方便查看博客,特意申請了一個公衆號,附上二維碼,有興趣的朋友可以關注,和我一起討論學習,一起享受技術,一起成長。
1. ANSI 標準預處理命令
名稱 | 解釋 |
---|---|
#define | 宏定義 |
#undef | 撤銷已定義過的宏 |
#include | 使編譯程序將另一源文件嵌入到帶有 #include 的源文件中 |
#if / #else / #elif / #endif | #if 的一般含義是如果 #if 後面的常量表達式爲 true,則編譯它與 #endif 之間的代碼,否則跳過這些代碼。命令#endif 標識與一個 #if 塊結束。#else 命令類似 else 語句,#else 建立在 #if 失敗下的另一選擇。#elif 命令與 else if 相同,構成 if -else if階梯狀的語句,可以進行多種編譯選擇 |
#ifdef / #ifndef | 表示有定義與無定義 |
#line | 改變當前行數和文件名稱,形式:#line number [“filename”] |
#error | 編譯程序時,只要遇到 #error 就會生產一個編譯錯誤信息,並停止編譯 |
#pragma | 允許編譯程序傳送各種指令 |
_ LINE_ | 表示正在編譯文件的行號 |
_ FILE_ | 表示正在編譯文件的名字 |
_DATE _ | 表示編譯時刻的日期字符串 |
_ TIME_ | 表示編譯時刻的時間字符串 |
_STDC _ | 判斷文件是否定義爲標準 C 程序 |
2. 宏定義
#define :實現定義的替換,常用於常數的替換,錯誤碼的替換,方便了修改。宏在使用時才展開。
eg:#define PI 3.141592654
3. 字符串宏常量
#define 也可用來定義一些字符串,比如文件路徑:
#define ENG_PATH_1 E:\English\listen_to_this\listen_to_this_3
注:反斜槓作爲接續符時,在本行其後面不能再有任何字符,空格都不行。如下:只有最後一個反斜槓纔是接續符。
#define ENG_PATH_3 E:\English\listen_to_this\listen\
_to_this_3
4. 用 define 定義表達式
#define SEC_A_YEAR (60*60*24*365)UL //注意數據溢出問題
定義一個宏函數:
#define SQR(x) ((x) * (x)) //爲了減少替換錯誤,表示式通過括號限定範圍
注:宏函數被調用時是以實參換形參,而不是“值傳送”。
5. 條件編譯
條件編譯的功能使得我們可以按不同的條件去編譯不同的程序部分,因而產生不同的目標代碼文件。這對於程序的移植和調試是很有用的。
//第一種形式:
#ifdef 標識符
程序段1
#else
程序段2
#endif
解釋:如果標識符1 已被 #define 定義(條件爲真),則執行 #ifdef ,否則執行 #else,如果程序段 2 不存在,可省略 #else。
//第二種形式:
#ifndef 標識符
程序段1
#else
程序段2
#endif
解釋:與上述第一種情況相反。
//第三種形式:
#if 常量表達式
程序段1
#else
程序段2
#endif
解釋:如常量表達式的值爲真(非0),則對程序段 1 進行編譯,否則對程序段 2 進行編譯。使程序在不同條件下,完成不同的功能。
6. #include
文件包含是預處理的一個重要功能,它可以用來把多個源文件連接成一個源文件進行編譯,結果將生成一個目標文件。 C 語言提供 #include 命令來實現文件包含操作,實際是宏替換的延伸。
格式一:
#include <filename.h>
頭文件:表示預處理到系統規定的路徑中去獲得這個頭文件,找到文件後,用文件內容替換該語句。
格式二:
#include "filename.h"
雙引號表示預處理應當在當前目錄中查找文件名爲 filename 的文件,若沒有找到,則按照系統指定的路徑信息,搜索其他目錄,找到文件後,用文件內容替換該語句。
注:
(1)#include 是將已經存在的文件內容嵌入到當前文件中;
(2)#include 的路徑:支持相對路徑,格式如:
.代表當前目錄;. . 代表上層目錄。