關於#pragma指令(2)

一:#pragma warning指令[zhi ling]

該指令[zhi ling]允許有選擇[xuan ze]性的修改[xiu gai]編譯[bian yi]器[bian yi qi]的警告消息[xiao xi]的行爲
指令[zhi ling]格式[zhi ling ge shi]如下:
#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...]
#pragma warning( push[ ,n ] )
#pragma warning( pop )

主要用到的警告表示有如下幾個:

once:只顯示[xian shi]一次(警告/錯誤[cuo wu]等)消息[xiao xi]
default:重置編譯[bian yi]器[bian yi qi]的警告行爲到默認[mo ren]狀態[zhuang tai]
1,2,3,4:四個警告級別
disable:禁止指定的警告信息[xin xi]
error:將指定的警告信息[xin xi]作爲錯誤[cuo wu]報告

如果大家對上面的解釋[jie shi]不是很理解,可以參考[can kao]一下下面的例子及說明[shuo ming]

#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等價於:
#pragma warning(disable:4507 34) // 不顯示[xian shi]4507和34號警告信息[xin xi]
#pragma warning(once:4385)        // 4385號警告信息[xin xi]僅報告一次
#pragma warning(error:164)        // 把164號警告信息[xin xi]作爲一個錯誤[cuo wu]。
同時這個pragma warning 也支持[zhi chi]如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
這裏n代表一個警告等級(1---4)。
#pragma warning( push )保存所有警告信息[xin xi]的現有的警告狀態[zhuang tai]。
#pragma warning( push, n)保存所有警告信息[xin xi]的現有的警告狀態[zhuang tai],並且把全局警告
等級設定爲n。  
#pragma warning( pop )向棧中彈出最後一個警告信息[xin xi],在入棧和出棧之間所作的
一切改動取消[qu xiao]。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
#pragma warning( pop )

在這段代碼[dai ma]的最後,重新保存所有的警告信息[xin xi](包括4705,4706和4707)

在使用標準C++進行編程[bian cheng]的時候經常會得到很多的警告信息[xin xi],而這些警告信息[xin xi]都是不必要的提示[ti shi],
所以我們可以使用#pragma warning(disable:4786)來禁止該類型[lei xing]的警告

vc中使用ADO的時候也會得到不必要的警告信息[xin xi],這個時候我們可以通過
#pragma warning(disable:4146)來消除該類型[lei xing]的警告信息[xin xi]


二:#pragma pack()
注:如果設置[she zhi]的值比結構[jie gou]體中字節最長的類型[lei xing]還要大,則這個變量[bian liang](注意僅針對這一個變量[bian liang])只按照它的字節長度對齊[dui qi],即不會出現內存[nei cun]浪費的情況[qing kuang]。請參見(4)。
(1)
#pragma pack(1)        //每個變量[bian liang]按照1字節對齊[dui qi]
struct A
{
char x;    //aligned on byte boundary 0
int y;     //aligned on byte boundary 1
}a;
sizeof(a)==5
(2)
#pragma pack(2)        //每個變量[bian liang]按照2字節對齊[dui qi]
struct A
{
char x;    //aligned on byte boundary 0
int y;     //aligned on byte boundary 2
}a;
sizeof(a)==6
(3)
#pragma pack(4)        //每個變量[bian liang]按照4字節對齊[dui qi]
struct A
{
char x;    //aligned on byte boundary 0
int y;     //aligned on byte boundary 4
}a;
sizeof(a)==8(4)
#pragma pack()        //默認[mo ren],相當於#pragma pack(8) 每個變量[bian liang]按照8字節對齊[dui qi]
struct A
{
char x;    //aligned on byte boundary 0
int y;     //aligned on byte boundary 4
}a;
sizeof(a)==8
但是這裏y的大小是4字節,所以不會按照8字節對齊[dui qi],否則將造成1個int空間[kong jian]的浪費

三.#pragma comment
The following pragma causes the linker to search for the EMAPI.LIB library while linking. The linker searches first in the current working directory and then in the path specified in the LIB environment variable:
#pragma comment( lib, "emapi" )


四.#pragma deprecated
When the compiler encounters a deprecated symbol, it issues C4995:
void func1(void) {}
void func2(void) {}
int main() {
   func1();
   func2();
   #pragma deprecated(func1, func2)
   func1();   // C4995
   func2();   // C4995
}


五.#pragma message
The following code fragment uses the message pragma to display a message during compilation:

#if _M_IX86 == 500
#pragma message( "Pentium processor build" )
#endif 
 

六.#pragma once

防止頭文件[wen jian]重複包含,主要是使頭文件[wen jian]只被編譯[bian yi]一次,這樣就不會重複了

七.#pragma code_seg( ["section-name"[,"section-class"] ] )
它能夠設置[she zhi]程序中函數[han shu]代碼[dai ma]存放的代碼[dai ma]段,當我們開發驅動程序[qu dong cheng xu]的時候就會使用到它。

八.#pragma resource "*.dfm"

用於[yong yu]表示把*.dfm文件[wen jian]中的資源[zi yuan]加入工程。*.dfm中包括窗體[chuang ti]外觀的定義。

九、#pragma  loop_opt(on/off)

用於[yong yu]激活[ji huo]或者關閉循環[xun huan]優化[you hua]

十、#pragma data_seg("seg"),新建一個節,如:

#pragma data_seg("MySec")

HWND g_hWnd = NULL;//這個變量[bian liang]是全局共享的。
#pragma data_seg()

#pragma comment(linker,"/section:MySec, RWS")//設置[she zhi]Seg爲讀寫[du xie]共享

或者,如果在DEF模塊[mo kuai]定義文件[wen jian]裏

LIBRARY DLL
EXPORTS

;導出函數[han shu]。
SEGMENTS
MySec READ WRITE SHARED  ;設置[she zhi]節的屬性[shu xing]。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章