在所有的預(yù)處理指令中,#Pragma 指令可能是最復(fù)雜的了,它的作用是設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動(dòng)作。#pragma指令對每個(gè)編譯器給出了一個(gè)方法,在保持與C和C ++語言完全兼容的情況下,給出主機(jī)或操作系統(tǒng)專有的特征。依據(jù)定義,編譯指示是機(jī)器或操作系統(tǒng)專有的,且對于每個(gè)編譯器都是不同的。
其格式一般為: #Pragma Para
其中Para 為參數(shù),下面來看一些常用的參數(shù)。
(1)message 參數(shù)。
Message 參數(shù)是我最喜歡的一個(gè)參數(shù),它能夠在編譯信息輸出窗口中輸出相應(yīng)的信息,這對于源代碼信息的控制是非常重要的。其使用方法為:
#Pragma message(“消息文本”)
當(dāng)編譯器遇到這條指令時(shí)就在編譯輸出窗口中將消息文本打印出來。
當(dāng)我們在程序中定義了許多宏來控制源代碼版本的時(shí)候,我們自己有可能都會(huì)忘記有沒有正確的設(shè)置這些宏,此時(shí)我們可以用這條指令在編譯的時(shí)候就進(jìn)行檢查。
假設(shè)我們希望判斷自己有沒有在源代碼的什么地方定義了_X86這個(gè)宏可以用下面的方法
#ifdef _X86
#Pragma message(“_X86 macro activated!”)
#endif
當(dāng)我們定義了_X86這個(gè)宏以后,應(yīng)用程序在編譯時(shí)就會(huì)在編譯輸出窗口里顯示“_
X86 macro activated!”。我們就不會(huì)因?yàn)椴挥浀米约憾x的一些特定的宏而抓耳撓腮了。
(2)另一個(gè)使用得比較多的pragma參數(shù)是code_seg。
格式如:
#pragma code_seg( ["section-name"[,"section-class"] ] )
它能夠設(shè)置程序中函數(shù)代碼存放的代碼段,當(dāng)我們開發(fā)驅(qū)動(dòng)程序的時(shí)候就會(huì)使用到它。
(3)#pragma once (比較常用)
只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次,這條指令實(shí)際上在VC6中就已經(jīng)有了,但是考慮到兼容性并沒有太多的使用它。
(4)#pragma hdrstop
表示預(yù)編譯頭文件到此為止,后面的頭文件不進(jìn)行預(yù)編譯。BCB可以預(yù)編譯頭文件以加快鏈接的速度,但如果所有頭文件都進(jìn)行預(yù)編譯又可能占太多磁盤空間,所以使用這個(gè)選項(xiàng)排除一些頭文件。
有時(shí)單元之間有依賴關(guān)系,比如單元A依賴單元B,所以單元B要先于單元A編譯。你可以用#pragma startup指定編譯優(yōu)先級(jí),如果使用了#pragma package(smart_init) ,BCB就會(huì)根據(jù)優(yōu)先級(jí)的大小先后編譯。
(5)#pragma resource
#pragma resource "*.dfm"表示把*.dfm文件中的資源加入工程。*.dfm中包括窗體外觀的定義。
(6)#pragma warning
#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等價(jià)于:
#pragma warning(disable:4507 34) // 不顯示4507和34號(hào)警告信息
#pragma warning(once:4385) // 4385號(hào)警告信息僅報(bào)告一次
#pragma warning(error:164) // 把164號(hào)警告信息作為一個(gè)錯(cuò)誤。
同時(shí)這個(gè)pragma warning 也支持如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
這里n代表一個(gè)警告等級(jí)(1---4)。
#pragma warning( push )保存所有警告信息的現(xiàn)有的警告狀態(tài)。
#pragma warning( push, n)保存所有警告信息的現(xiàn)有的警告狀態(tài),并且把全局警告等級(jí)設(shè)定為n。
#pragma warning( pop )向棧中彈出最后一個(gè)警告信息,在入棧和出棧之間所作的一切改動(dòng)取消。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
//.......
#pragma warning( pop )
在這段代碼的最后,重新保存所有的警告信息(包括4705,4706和4707)。
(7)pragma comment(...)
該指令將一個(gè)注釋記錄放入一個(gè)對象文件或可執(zhí)行文件中。
常用的lib關(guān)鍵字,可以幫我們連入一個(gè)庫文件。
(8)progma data_seg
有的時(shí)候我們可能想讓一個(gè)應(yīng)用程序只啟動(dòng)一次,就像單件模式(singleton)一樣,實(shí)現(xiàn)的方法可能有多種,這里說說用#pragma data_seg來實(shí)現(xiàn)的方法,很是簡潔便利。
應(yīng)用程序的入口文件前面加上
#pragma data_seg("flag_data")
int app_count = 0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:flag_data,RWS")
然后程序啟動(dòng)的地方加上
if(app_count>0) // 如果計(jì)數(shù)大于0,則退出應(yīng)用程序。
{
//MessageBox(NULL, "已經(jīng)啟動(dòng)一個(gè)應(yīng)用程序", "Warning", MB_OK);
//printf("no%d application", app_count);
return FALSE;
}
app_count++;
Windows 在一個(gè)Win32程序的地址空間周圍筑了一道墻。通常,一個(gè)程序的地址空間中的數(shù)據(jù)是私有的,對別的程序而言是不可見的。但是執(zhí)行STRPROG的多個(gè)執(zhí)行實(shí)體表示了STRLIB在程序的所有執(zhí)行實(shí)體之間共享數(shù)據(jù)是毫無問題的。當(dāng)您在一個(gè)STRPROG窗口中增加或者刪除一個(gè)字符串時(shí),這種改變將立即反映在其它的窗口中。
在全部例程之間,STRLIB共享兩個(gè)變量:一個(gè)字符數(shù)組和一個(gè)整數(shù)(記錄已儲(chǔ)存的有效字符串的個(gè)數(shù))。STRLIB將這兩個(gè)變量儲(chǔ)存在共享的一個(gè)特殊內(nèi)存區(qū)段中:
#pragma data_seg ("shared")
int iTotal = 0 ;
WCHAR szStrings [MAX_STRINGS][MAX_LENGTH + 1] = { '\0' } ;
#pragma data_seg ()
第一個(gè)#pragma敘述建立數(shù)據(jù)段,這里命名為shared。您可以將這段命名為任何一個(gè)您喜歡的名字。在這里的#pragma敘述之后的所有初始化了的變量都放在shared數(shù)據(jù)段中。第二個(gè)#pragma敘述標(biāo)示段的結(jié)束。對變量進(jìn)行專門的初始化是很重要的,否則編譯器將把它們放在普通的未初始化數(shù)據(jù)段中而不是放在shared中。
連結(jié)器必須知道有一個(gè)「shared」共享數(shù)據(jù)段。在「Project Settings」對話框選擇「Link」頁面卷標(biāo)。選中「STRLIB」時(shí)在「Project Options」字段(在Release和Debug設(shè)定中均可),包含下面的連結(jié)敘述:
字母RWS表示段具有讀、寫和共享屬性。或者,您也可以直接用DLL原始碼指定連結(jié)選項(xiàng),就像我們在STRLIB.C那樣:
#pragma comment(linker,"/SECTION:shared,RWS")
共享的內(nèi)存段允許iTotal變量和szStrings字符串?dāng)?shù)組在STRLIB的所有例程之間共享。因?yàn)镸AX_STRINGS等于256,而 MAX_LENGTH等于63,所以,共享內(nèi)存段的長度為32,772字節(jié)-iTotal變量需要4字節(jié),256個(gè)指針中的每一個(gè)都需要128字節(jié)。