C語言再學習13——預處理(一)

前言:

爲了方便查看博客,特意申請了一個公衆號,附上二維碼,有興趣的朋友可以關注,和我一起討論學習,一起享受技術,一起成長。

在這裏插入圖片描述


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 的路徑:支持相對路徑,格式如:

.代表當前目錄;. . 代表上層目錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章