C語言 預處理命令

2021-04-21 17:27:54 字數 4654 閱讀 8802

我們可以在c源程式中插入傳給編譯程式的各中指令,這些指令被稱為預處理器指令,它們擴充了程式設計的環境。現把常用的預處理命令總結如下:

1.      預處理程式

按照ansi標準的定義,預處理程式應該處理以下指令:

#if #ifdef #ifndef #else #elif

#endif

#define

#undef

#line

#error

#pragma

#include

顯然,上述所有的12個預處理指令都以符號#開始,,每條預處理指令必須獨佔一行。

2.      #define

#define指令定義乙個識別符號和乙個串(也就是字符集),在源程式中發現該識別符號時,都用該串替換之。這種識別符號稱為巨集名字,相應的替換稱為巨集代換。一般形式如下:

#define macro-name char-sequence

這種語句不用分號結尾。巨集名字和串之間可以有多個空白符,但串開始後只能以新行終止。

例如:我們使用left代表1,用right代表0,我們使用兩個#define指令:

#define left 1

#define right 0

每當在源程式中遇到left或right時,編譯程式都用1或0替換。

定義乙個巨集名字之後,可以在其他巨集定義中使用,例如:

#define one 1

#define two one+one

#define three one+two

巨集代換就是用相關的串替代識別符號。因此,如果希望定義一條標準錯誤資訊時,可以如下定義:

#define error_ms 「standard error on input /n」

如果乙個串長於一行,可在行尾用反斜線」/」續行,如下:

#define long_string 「this is a very very long /

string that is used as an example」

3.      #error

#error指令強制編譯程式停止編譯,它主要用於程式除錯。#error指令的一般形式是:

#error error-message

注意,巨集串error-message不用雙引號包圍。遇到#error指令時,錯誤資訊被顯示,可能同時還顯示編譯程式作者預先定義的其他內容。

4.      #include

程式中的#include指令要求編譯程式讀入另乙個原始檔。被讀入檔案的名字必須用雙引號(「」)或一對尖括號(<>)包圍,例如:

#include 「stdio.h」

#include

都使c編譯程式讀入並編譯標頭檔案以用於i/o系統庫函式。

包含檔案中可以包含其他#include指令,稱為巢狀包含。允許的最大巢狀深度隨編譯器而變。

檔名被雙括號或尖括號包圍決定了對指定檔案的搜尋方式。檔名被尖括號包圍時,搜尋按編譯程式作者的定義進行,一般用於搜尋某些專門放置包含檔案的特殊目錄。當檔名被雙括號包圍時,搜尋按編譯程式實時的規定進行,一般搜尋當前目錄。如未發現,再按尖括號包圍時的辦法重新搜尋一次。

通常,絕大多數程式設計師使用尖括號包圍標準的標頭檔案,雙引號用於包圍與當前程式相關的檔名。

5.      條件編譯指令

若干編譯指令允許程式設計師有選擇的編譯程式源**的不同部分,這種過程稱為條件編譯。

5.1#if、#else、#elif #endif

條件編譯指令中最常用的或許是#if,#else,#elif和#endif。這些指令允許程式設計師根據常數表示式的結果有條件的包圍部分**。

#if的一般形式是:

#if constant-expression

statement sequence

#endif

如#if後的常數表示式為真,則#if和#endif中間的**被編譯,否則忽略該**段。#endif標記#if塊的結束。

#else指令的作用與c語言的else相似,#if指令失敗時它可以作為備選指令。例如:

#include

#define max 100

int main(void)

注意,#else既是標記#if塊的結束,也標記#else塊的開始。因為每個#if只能寫乙個#endif匹配。

#elif指令的意思是「否則,如果」,為多重編譯選擇建立一條if-else-if(如果-否則-如果鏈)。如果#if表示式為真,該**塊被編譯,不測試其他#elif表示式。否則,序列中的下一塊被測試,如果成功則編譯之。一般形式如下:

#if expression

statement sequence

#elif expression1

statement sequence

#elif expression2

statement sequence..

.#elif expression

statement sequence

#endif

5.2#ifdef和#ifndef

條件編譯的另乙個方法是使用編譯指令#ifdef和#ifndef,分別表示「如果已定義」和「如果未定義」。#ifdef的一般形式如下:

#ifdef macro-name

statement sequence

#endif

如果macro-name原先已經被乙個#define語句定義,則編譯其中的**塊。

#ifndef的一般形式是:

#ifndef macro-name

statement sequence

#endif

如果macro-name當前未被#define語句定義,則編譯其中的**塊。

#ifdef和#ifndef都可以使用#else或#elif語句。

#inlucde

#define t 10

int main(void)

6.      #undef

#undef指令刪除前面定義的巨集名字。也就是說,它「不定義」巨集。一般形式為:

#undef macro-name

7.      使用defined

除#ifdef之外,還有另外一種確定是否定義巨集名字的方法,即可以將#if指令與defined編譯時操作符一起使用。defined操作符的一般形式如下:

defined macro-name

如果macro-name是當前定義的,則表示式為真,否則為假。

例如,確定巨集my是否定義,可以使用下列兩種預處理命令之一:

#if defined my

或#ifdef my

也可以在defined之前加上感嘆號」!」來反轉相應的條件。例如,只有在debug未定義的情況下才編譯。

#if !defined debug

printf(「final version!/n」);

#endif

使用defined的乙個原因是,它允許由#elif語句確定的巨集名字存在。

8.      #line

#line指令改變__line__和__file__的內容。__line__和__file__都是編譯程式中預定義的識別符號。識別符號__line__的內容是當前被編譯**行的行號,__file__的內容是當前被編譯原始檔的檔名。#line的一般形式是:

#line number 「filename」

其中,number是正整數並變成__line__的新值;可選的「filename」是合法檔案識別符號並變成__file__的新值。#line主要用於除錯和特殊應用。

9.      #pragma

#pragma是編譯程式實現時定義的指令,它允許由此向編譯程式傳入各種指令。例如,乙個編譯程式可能具有支援跟蹤程式執行的選項,此時可以用#pragma語句選擇該功能。編譯程式忽略其不支援的#pragma選項。#pragma提高c源程式對編譯程式的可移植性。

10. 預處理操作符#和##

有兩個預處理操作符:#和##,它們可以在#define中使用。

操作符#通常稱為字串化的操作符,它把其後的串變成用雙引號包圍的串。例如:

#include

#define mkstr(s) #s

int main(void)

預處理程式把以下的語句:

printf(mkstr(i like c));

變成printf(「i like c」);

操作符##把兩個標記拼在一起,形成乙個新標記。例如:

#include

#define concat(a,a) a##b

int main(void)

預處理程式把以下語句:

printf(「%d」,concat(x,y));

變成printf(「%d」,xy);

操作符#和##主要作用是允許預處理程式對付某些特殊情況,多數程式中並不需要。

11. 預定義巨集

c規範了5個固有的預定義巨集,它們是:

__line__

__file__

__date__

__time__

__stdc__

__line__和__file__包含正在編譯的程式的行號和檔名。

__date__和內容形如month/day/year(月/日/年)的串,代表原始檔翻譯成目標碼的日期。

__time__中的串代表源**編譯成目標碼的時間,形如hour:minute:second(時:分:秒)

如果__stdc__的內容是十進位制常數1,則表示編譯程式的實現符合標準c。

C語言 預處理命令

一 巨集定義 在 語言源程式中允許用乙個識別符號來表示乙個字串,稱為 巨集 被定義為 巨集 的識別符號稱為 巨集名 在編譯預處理時,對程式中所有出現的 巨集名 都用巨集定義中的字串去代換,這稱為 巨集代換 或 巨集展開 巨集定義是由源程式中的巨集定義命令完成的。巨集代換是由預處理程式自動完成的。在 ...

C語言預處理命令

以 開頭的預處理命令。如 include,巨集定義命令 define pi 3.1415926等。在源程式中這些命令都放在函式之外,而且一般放在原始檔前面,它們稱為預處理部分。無參巨集定義 無參巨集的巨集名後不帶引數。其定義的一般形式為 define 識別符號 字串 其中的 表示這是一條預處理命令,...

C語言預處理命令

我們經常使用 include命令。使用庫函式之前,應該用 include引入對應的標頭檔案。這種以 號開頭的命令稱為預處理命令。1 編譯 compile 會將原始檔 c檔案 轉換為目標檔案。對於 vc vs,目標檔案字尾為.obj 對於gcc,目標檔案字尾為.o。編譯是針對單個原始檔的,一次編譯操作...