c 的預處理程式指令

2021-07-09 11:28:21 字數 2853 閱讀 7587

c++中的預處理功能主要是指可以在c++源程式中包含各種編譯指令,用這些編譯命令在**編譯前執行,所以這些命令被稱為預處理命令,實現c++的預處理功能。

預處理指令是編譯系統的控制命令,編譯系統根據其要求先對**進行優化,然後在進行編譯,使程式變得簡練清晰。常見的預處理命令有:檔案包含命令、條件編譯命令和巨集定義命令。所有的預處理命令都是以「#」開始的,每一條命令單獨佔一行。當預處理命令比較長需要分行時,在同一行的最後要加上「\」續行符。預處理命令可以放在程式檔案的任何位置。

include命令是預處理中的檔案包含命令,檔案包含的意思講其他檔案內容插入到當前命令位置,只是其在編輯**時並不出現,只在編譯時才插入進來。#include<>是包含那些由系統提供的並存在指定子目錄中的標頭檔案,#include「」是包含那些使用者自定義的放在當前目錄或者其他目錄下的標頭檔案和源**檔案。

標頭檔案是指有函式、常量、結構或者其他複雜型別什麼的,以h作為副檔名的檔案。標頭檔案包含命令一般被放在原始檔的頭部。在使用標頭檔案包含命令時需要主要:

1.1條檔案包含指令只能包含乙個檔案,若想包含多個檔案,應當使用多條檔案包含指令。例如

#include

#include

2.在被包含的檔案中,還可以使用檔案包含指令包含其他檔案,即檔案包含命令可以巢狀使用。例如myfunc.h資料夾中,包含了其他標頭檔案。

#include

#include

這樣myfunc.h檔案中包含了另外兩個檔案。

3.在定義被包含檔案時,其內容不宜過多。如果太多,將會導致被包含檔案的內容利用率變低,而且增大了目標檔案的大小。

巨集定義看起來和常量定義const非常類似,單也是有區別的,如下:

1.const定義的是乙個有資料型別的常量,而巨集定義的是沒有資料型別的,可以用其替換程式**中的任何字元常量

2.const定義的常量是有記憶體分配,並儲存在記憶體中,而巨集定義沒有記憶體分配

3.const定義常量是乙個語句,以分號結束,而巨集定義是預處理命令,不能用分號結束

在c++中一般不用#define來定義常量,而使用const

使用#define命令時需注意:

1.巨集名和字串之間應該有空格間隙,不要用等號進行連線

2.#define是乙個預處理命令。其所定義的識別符號等價於後面的字串,不要再最後加分號,例如

#define len 10;

這裡len等價於「10;」,而不是「10」

在程式中,一旦有巨集定義,那麼其作用域就是從檔案中定義的開始到定義的檔案結束,在檔案範圍內有效。如果其作用域不這麼大,可以使用undef命令來取消巨集定義。例如

#define n10 

void main()

{}   n有效

#undef n

void fun()

{}    n無效

巨集函式相當於c++的內聯函式,但其沒有引數資料型別的匹配檢查。而且內聯函式的效率更高。

在使用巨集函式時需注意:

1.帶引數的巨集函式的字串應寫在一行上,如果需要多行。每行結束時使用續行符結束,並在該符號後按下回車鍵

2.在定義巨集函式時,函式名和「()」之間不能有空格,否則「()」和右邊的全部會被當做字串,例如

#define add (x+y) x+y

這時是將(x+y) x+y作為巨集替換的字串處理,而非x+y當做巨集替換字串

3.定義巨集函式時,應該為每個引數名加上(),例如

#define m(x,y) x*y

在定義時不加括號,如果其引用的語句如下:

sum=m(a+10,b+20);

但因沒有給引數加括號,所以替換後變為

sum=a+10*b+20;

條件編譯命令的作用是用來定義原始檔中的某些編譯**在一定的條件下參與編譯,如果條件不滿足則不編譯。常用的條件編譯命令的格式有3種:

1.#ifdef-#else-#endif

#ifdef 識別符號

**段1

#else

**段2

#endif

意思就是當識別符號被定義過則對**段1進行編譯,如果沒有被定義則對**段2編譯

2.#ifndef-#else-#endif

3.#if-#else-#endif

#if 常量表示式1

**段1

#elif 常量表示式2

**段2 ……

#elif 常量表示式n

**段n

#else 

**段n+1

#endif

在c++中常常把乙個函式、全域性變數、全域性常量和結構及其他一些資料型別的宣告放在標頭檔案中。這樣的好處就是可以在程式的任何乙個源**檔案中對這些資料進行引用。例如可以把乙個結構宣告放在標頭檔案中。這樣只要是源**檔案中和有需要這個結構的地方,就把宣告這個結構的標頭檔案包含進來,就可以使用,而不需要再次宣告。

不過由於檔案包含指令可以巢狀使用,因此有時可能導致多次包含同乙個標頭檔案,最後形成重複宣告的問題。例如:

#include「file1.h」

#include「file2.h」

void main()

其中file1.h檔案#include「xiaokun.h"

file2.h中#include「xiaokun.h」

如果是這樣那麼main.cpp中就會導致兩次包含乙個標頭檔案。為了避免這種情況,只有在標頭檔案中自定義乙個唯一的識別符號,如果其被定義過,則標頭檔案將不再被包含。具體做法是在「xiaokun.h」中增加如下內容:

#ifndef _xiaokun_h_

#define _xiaokun_h_

中的**段

#endif

第一次被包含時,沒有被定義所以就會被編譯,第二次被包含時就不會被編譯了。

應該養成給每乙個自定義的標頭檔案都增加這樣唯一的檔案識別符號,防止標頭檔案被重複包含!!!!!!!

C 預處理指令

1.define 通常和 if一起使用 使用 define可以定義乙個符號,並通過將該符號用作表示式傳遞給 if 指令,使該表示式的計算結果為true 比如 preprocessor if.cs define debug define vc v7 using system public class ...

C預處理指令

一 預處理的由來 在c 的歷史發展中,有很多的語言特徵 特別是語言的晦澀之處 來自於c語言,預處理就是其中的乙個。c 從c語言那裡把c語言預處理器繼承過來 c語言預處理器,被bjarne博士簡稱為cpp,不知道是不是c program preprocessor的簡稱 二 常見的預處理功能 預處理器的...

C 預處理指令

巨集定義指令定義了乙個識別符號 巨集名 及乙個字串,在源程式中每次遇到該識別符號時,均以定義的字串替換它 巨集替換 巨集名和引數間不能有空格,識別符號和字串間可有任意空格 字串中應習慣對巨集引數加上括號,這樣使用巨集時,如果實參是表示式,則不易出錯 巨集替換只作巨集名和引數替換,不做計算,不做表示式...