資源描述:
《預(yù)處指令#if#esle#endif#ifdef(詳細(xì))》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、預(yù)處指令#if#esle#endif#ifdef分類:?C/C++2006-05-2412:41?1138人閱讀?評(píng)論(1)?收藏?舉報(bào)microsoft編譯器語(yǔ)言c++wrapper擴(kuò)展預(yù)處理器是一種處理源文件文本的文本處理器,它是翻譯起始階段的一個(gè)組成部分。預(yù)處理器并不在語(yǔ)法上分析處理源文本,但出于定位宏調(diào)用的目的,它將源文本分開語(yǔ)言符號(hào)。雖然編譯器一般在初次編譯時(shí)啟動(dòng)預(yù)處理器,但預(yù)處理器也可以不經(jīng)編譯,單獨(dú)地處理文本。Microsoft特殊處用/E或/EP編譯器選項(xiàng)進(jìn)行預(yù)處理之后,你可以得到一個(gè)源代碼的
2、列表。在多數(shù)情況下,啟動(dòng)預(yù)處理器和輸出結(jié)果文本到輸出設(shè)備,這兩種選項(xiàng)都是控制臺(tái)指令,這兩種選項(xiàng)的區(qū)別在于/E包括了#line指令,/EP沒(méi)有這些指令。Microsoft特殊處結(jié)束特殊術(shù)語(yǔ)在本書中,名詞“參量”指的是傳送給一個(gè)函數(shù)的實(shí)體。有時(shí)候,它用“actual”或“formal”修飾,它們分別用于表示函數(shù)調(diào)用時(shí)的參量表達(dá)式和在函數(shù)定義時(shí)的參量說(shuō)明。名詞“變量”指的是一種簡(jiǎn)單的C類型數(shù)據(jù)對(duì)象,名詞“對(duì)象”指的是C++對(duì)象和變量;它是一個(gè)含義廣泛的名詞。翻譯階段C和C++程序由一個(gè)或多個(gè)源文件組成,它們都包含了
3、程序的某些文本,一個(gè)不包含代碼部分的源文件和它的包含文件(用#indude預(yù)處理器指令包含的文件),若被條件編譯指令(比如#if)調(diào)用,則稱其為一個(gè)“轉(zhuǎn)換單元”。源文件可被翻譯多次,翻譯過(guò)去的文件事實(shí)上是很正常的。已經(jīng)翻譯了的翻譯單元可保存在單獨(dú)的對(duì)象文件或?qū)ο蟠a庫(kù)里,這些單個(gè)的轉(zhuǎn)換單元可被連接形成一個(gè)可執(zhí)行文件或動(dòng)態(tài)鏈接庫(kù)(DLL)。轉(zhuǎn)換單元可采用下列形式通信:*調(diào)用具有外部連接的函數(shù)。*調(diào)用具有外部連接的類成員函數(shù)。*直接更改具有外部連接的對(duì)象。*文件的直接更改。*內(nèi)部外理通信(僅限于基于Microso
4、ftWindows的應(yīng)用程序)。以下是編譯器翻譯文件的各個(gè)階段:字符映射源文件中的字符被映射為內(nèi)部源代碼的形式。此階段三字母序列被轉(zhuǎn)換為單字符的內(nèi)部表現(xiàn)形式。行拼接在此階段,源文件中所有以反斜杠(/)結(jié)尾且其后緊跟一換行符的行,將與下一行連接,從而由物理行生成邏輯行。所有非空源文件結(jié)束于一個(gè)前面沒(méi)有反斜杠的換行符。語(yǔ)言符號(hào)化此階段源文件被分為預(yù)處理語(yǔ)言符號(hào)和空白字符。源文件中每個(gè)注釋被用一個(gè)空白字符代替。換行符被保留。預(yù)處理此階段執(zhí)行預(yù)處理指令并將宏擴(kuò)展至源文件,#include語(yǔ)句調(diào)用對(duì)所有包括文本啟動(dòng)前面
5、三個(gè)翻譯步驟開頭的翻譯過(guò)程。字符集映射所有的源字符集成員和轉(zhuǎn)義序列將轉(zhuǎn)換為執(zhí)行字符集中的等價(jià)形式,對(duì)于MicrosoftC和C++來(lái)說(shuō),源字符集和執(zhí)行字符集都是ASCII碼。字符串合并所有相鄰的字符串和寬字符文字都將被合并。例如:“String”“concatenation”合并為“Stringconcatenation”。翻譯所有的語(yǔ)言符號(hào)將按語(yǔ)法和語(yǔ)義規(guī)則進(jìn)行分析;這些語(yǔ)言符號(hào)被轉(zhuǎn)換為目標(biāo)代碼。鏈接此階段所有的外部引用被分解以生成一個(gè)可執(zhí)行程序或一個(gè)動(dòng)態(tài)鏈接庫(kù)。編譯器在翻譯過(guò)程中遇到語(yǔ)法錯(cuò)誤時(shí),將發(fā)出一個(gè)
6、警告或錯(cuò)誤信息。鏈接器分解所有的外部引用,并把一個(gè)或多個(gè)分開處理的轉(zhuǎn)換單元和標(biāo)準(zhǔn)庫(kù)聯(lián)接起來(lái),以生成一個(gè)可執(zhí)行程序或動(dòng)態(tài)鏈接庫(kù)(DLL)。預(yù)處理器指令預(yù)處理器指令如#define和#ifdef,一般被用在不同的運(yùn)行環(huán)境下,使源程序易于更改和編譯。源文件中的指令指示預(yù)處理器執(zhí)行特有的行為。例如,預(yù)處理器可替換文本中的語(yǔ)言符號(hào),將其它的文件內(nèi)容插入源文件中,或移走文本的一部分以抑制文件中某部分的編譯。預(yù)處理器行在宏擴(kuò)展之前被識(shí)別且執(zhí)行。不過(guò),如果宏擴(kuò)展看起來(lái)象一個(gè)預(yù)處理器指令,該命令將不能被預(yù)處理器識(shí)別。除轉(zhuǎn)義序列
7、之外,預(yù)處理器語(yǔ)句采用與源文件語(yǔ)句相同的字符集。在預(yù)處理器語(yǔ)句中的字符集和可執(zhí)行程序的字符集是一樣的。預(yù)處理器也可識(shí)別負(fù)字符值。預(yù)處理器可識(shí)別如下指令:#define#error#import#undef#elif#if#include#else#ifdef#line#endif#ifndef#pragma數(shù)字符號(hào)(#)是包含預(yù)處理器指令的行中的第一個(gè)非空白字符??瞻鬃址沙霈F(xiàn)在數(shù)字符號(hào)和指令的第一個(gè)字母之間。某些指令包含參量和值。指令之后的任何文本(除作為指令一部分的參量或值之外)必須放在單行注釋分界符(/
8、/)之后或注釋分界符(/**/)之間。預(yù)處理器指令可出現(xiàn)在源文件的任何地方,但它們僅用于源文件的剩余部分。#define指令可以用#define指令給程序中的常量取一個(gè)有意義的名稱,其語(yǔ)法的兩種形式如下:語(yǔ)法#define標(biāo)識(shí)符語(yǔ)言符號(hào)字符串opt#define標(biāo)識(shí)符[(標(biāo)識(shí)符opt,...,標(biāo)識(shí)符opt)]語(yǔ)言符號(hào)字符串opt#define指令用語(yǔ)言符號(hào)字符串替換源文件中一個(gè)標(biāo)識(shí)符的所有出現(xiàn),標(biāo)識(shí)