C語言的預處理指令

1.文件包含:#include指令

include預處理指令告訴預處理器,將指定文件的內容插入到預處理器指定位置,有兩種格式:

  1. 要從標準鏈接庫或系統目錄尋找頭文件時,用 #include
  2. 要從當前目錄(或文件名中指定的其他目錄)中尋找頭文件時,用 #include “filename"
    例:
    #include “./app/filename”,表示從當前文件夾的app子文件夾尋找頭文件

2. 宏定義:#define指令

使用#define可以把一個名稱指定成任何文字,爲了區分宏和一般變量,宏名稱每個字符都是大寫。
宏可以有參數:
例: #define sum(a,b) (a + b)

  • 在C++標準下,可以定義有(…)的宏,省略號必須放在最後面,表示“可選的”。
    格式: #define 宏名稱([參數列表,] …) 替代文字
    替代文字中, VA_ARGS 標識符(兩側都是雙下劃線)表示一組可選性自變量。
    例: #define PR(…) printf( VA_ARGS)
  • 可用#undef XXX 來取消宏定義

2.1 字符串化運算符:

單元運算符#常常被稱爲字符串化運算符,因爲它會把一個宏參數轉換爲字符串。
例:
#define printfDBL(exp) printf( #exp" = %d", exp)
當exp = 1,打印結果: exp = 1

2.2 字符連接符:##

此運算符會把左右操作數結合在一起,成爲一個新的記號。
例:#define MSG(x) puts(test_ ## x)
MSG(1)輸出結果:test_1

2.3 字符化操作符: @#

將傳入單字符參數名轉換成字符,以一對單引用括起來。
例:#define BeChar(x) #@x
a= BeChar(x); 展開後 a = ‘x’;

3.條件編譯

#if…
#else if…
#else…
#endif
預編譯時,不滿足條件的代碼段將被忽略。
defined運算符,常出現在#if的條件中,用於判斷指定的標識符是否是宏名稱。
例:
#if defined XXX 簡寫爲:#ifdef XXX
類似的還有
#if !defined XXX 簡寫爲:#ifndef XXX

4. 重定義行號、文件名: #line

#line line_number [“filename”]
line_number:指定下一行的行號
filename: 指定編譯器中,本文件的新文件名
相當於重定義__LINE__和__FILE__

5. 產生錯誤信息: #error

#error [text]
預處理器發出錯誤信息,並停止編譯器。

6. 提供額外信息給編譯器: #pragma

#pragma [tokens] 沒怎麼用過。。。
例:#pragma pack(n) 按字節對齊

7. _Pragma運算符

用於宏定義,拓展#pragma功能。

8. 預定義的宏

DATE 進行預處理的日期:Mmm dd yyyy(例:Mar 19 2006)
FILE 當前文件名
LINE 當前行號
TIME 編譯時間:hh:mm:ss(例:08:00:59)
STDC 整數常量1,表示此編譯器遵循ISO C標準
STDC_HOSTED 如果目前的實現版本是“宿主”於操作系統,則爲1,否則爲0
STDC_VERSION 爲C99時,設置爲199901L

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