C學習筆記(9)--- 預處理器,頭文件

1.預處理器:程序員

 

預處理器不是編譯器的組成部分,可是它是編譯過程當中一個單獨的步驟。簡言之,C 預處理器只不過是一個文本替換工具而已,它們會指示編譯器在實際編譯以前完成所需的預處理。函數

咱們將把 C 預處理器(C Preprocessor)簡寫爲 CPP。工具

全部的預處理器命令都是以井號(#)開頭。它必須是第一個非空字符,爲了加強可讀性,預處理器指令應從第一列開始。具體的列表能夠在網上找到,這裏再也不復述。spa

 

a.幾個經常使用的:   操作系統

#define MAX_ARRAY_LENGTH 20  (全部的MAX_ARRAY_LENGTH 替換爲 20)字符串

 

#include <stdio.h>     原型

#include "myheader.h"   (這兩行指令告訴 CPP 從系統庫中獲取 stdio.h,並添加文本到當前的源文件中。下一行告訴 CPP 從本地目錄中獲取 myheader.h,並添加內容到當前的源文件中。)編譯器

 

b.預約義宏:io

不能修改的預約義宏,能夠根據狀況使用:編譯

__DATE__    當前日期,一個以 "MMM DD YYYY" 格式表示的字符常量。

 __TIME__       當前時間,一個以 "HH:MM:SS" 格式表示的字符常量

__FILE__        這會包含當前文件名,一個字符串常量。

__LINE__      這會包含當前行號,一個十進制常量。

__STDC__     當編譯器以 ANSI 標準編譯時,則定義爲 1。

 

c.預處理器運算符:

宏延續運算符(\):一個宏一般寫在一個單行上。可是若是宏太長,一個單行容納不下,則使用宏延續運算符.

字符串常量化運算符(#):在宏定義中,當須要把一個宏的參數轉換爲字符串常量時,則使用字符串常量化運算符(#)。在宏中使用的該運算符有一個特定的參數或參數列表.

標記粘貼運算符(##):宏定義內的標記粘貼運算符(##)會合並兩個參數。它容許在宏定義中兩個獨立的標記被合併爲一個標記。

 

d.參數化的宏:

CPP 一個強大的功能是可使用參數化的宏來模擬函數:

int square(int x)

{

 

return x * x;

}

 

這段代碼能夠用宏重寫:

#define square(x) ((x) * (x))      //注意全部的參數都要括號,否則運算錯誤

 

 

2.頭文件調用:

 

頭文件是擴展名爲 .h 的文件,包含了 C 函數聲明和宏定義,被多個源文件中引用共享。有兩種類型的頭文件:程序員編寫的頭文件和編譯器自帶的頭文件。

在程序中要使用頭文件,須要使用 C 預處理指令 #include 來引用它。前面咱們已經看過 stdio.h 頭文件,它是編譯器自帶的頭文件。

引用頭文件至關於複製頭文件的內容,可是咱們不會直接在源文件中複製頭文件的內容,由於這麼作很容易出錯,特別在程序是由多個源文件組成的時候。

A simple practice in C 或 C++ 程序中,建議把全部的常量、宏、系統全局變量和函數原型寫在頭文件中,在須要的時候隨時引用這些頭文件。

 

a.引用:

#include <file>  //引用的是編譯器的類庫路徑裏面的頭文件。

或者 

#include "file"  //引用的是你程序目錄的相對路徑中的頭文件,若是在程序目錄沒有找到引用的頭文件則到編譯器的類庫路徑的目錄下找該頭文件。

均可以。

 

 

b.具體操做:

#include 指令會指示 C 預處理器瀏覽指定的文件做爲輸入。預處理器的輸出包含了已經生成的輸出,被引用文件生成的輸出以及 #include 指令以後的文本輸出。

 

int x;

#include "header.h"     // 假如頭文件裏只有「char *test (void);」 ,這一段就會被那句話替代

 

int main (void) {

puts (test ());

}

 

c. 只引用一次:

若是一個頭文件被引用兩次,編譯器會處理兩次頭文件的內容,這將產生錯誤。爲了防止這種狀況,標準的作法是把文件的整個內容放在條件編譯語句中.

 

#ifndef HEADER_FILE

#define HEADER_FILE

。。。 //頭文件列表

#endif

 

d.有條件的引用:

有時須要從多個不一樣的頭文件中選擇一個引用到程序中。例如,須要指定在不一樣的操做系統上使用的配置參數:

 

#if SYSTEM_1

# include "system_1.h"

#elif SYSTEM_2

# include "system_2.h"

#elif SYSTEM_3

...

#endif

 

可是若是頭文件比較多的時候,這個方法不是很好,因此咱們用下面:

 

#define SYSTEM_H "system_1.h"

...

#include SYSTEM_H

 

SYSTEM_H 會擴展,預處理器會查找 system_1.h,就像 #include 最初編寫的那樣。SYSTEM_H 可經過 -D 選項被您的 Makefile 定義。

 

 

 

sub:在有多個 .h 文件和多個 .c 文件的時候,每每咱們會用一個 global.h 的頭文件來包括全部的 .h 文件,而後在除 global.h 文件外的頭文件中 包含 global.h 就能夠實現全部頭文件的包含,同時不會亂。方便在各個文件裏面調用其餘文件的函數或者變量。

相關文章
相關標籤/搜索