一一:#pragma warning指令
該指令允許有選擇性的修改編譯器的警告訊息的行為
指令格式如下:
#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...]
#pragma warning( push[ ,n ] )
#pragma warning( pop )
主要用到的警告表示有如下幾個:
once:只顯示一次(警告/錯誤等)訊息
default:重設編譯器的警告行為到預設狀態
1,2,3,4:四個警告層級
disable:禁止指定的警告資訊
error:將指定的警告資訊作為錯誤報表
如果大家對上面的解釋不是很理解,可以參考一下下面的例子及說明
#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等價於:
#pragma warning(disable:4507 34) // 不顯示4507和34號警告資訊
#pragma warning(once:4385) // 4385號警告資訊僅報告一次
#pragma warning(error:164) // 把164號警告資訊作為一個錯誤。
同時這個pragma warning 也支援如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
這裡n代表一個警告層級(1---4)。
#pragma warning( push )儲存所有警告資訊的現有的警告狀態。
#pragma warning( push, n)儲存所有警告資訊的現有的警告狀態,並且把全域警告
等級設定為n。
#pragma warning( pop )向棧中彈出最後一個警告資訊,在入棧和出棧之間所作的
一切改動取消。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
#pragma warning( pop )
在這段代碼的最後,重新儲存所有的警告資訊(包括4705,4706和4707)
在使用標準C++進行編程的時候經常會得到很多的警告資訊,而這些警告資訊都是不必要的提示,
所以我們可以使用#pragma warning(disable:4786)來禁止該類型的警告
在vc中使用ADO的時候也會得到不必要的警告資訊,這個時候我們可以通過
#pragma warning(disable:4146)來消除該類型的警告資訊
二:#pragma pack()
註:如果設定的值比結構體中位元組最長的類型還要大,則這個變數(注意僅針對這一個變數)只按照它的位元組長度對齊,即不會出現記憶體浪費的情況。請參見(4)。
(1)
#pragma pack(1) //每個變數按照1位元組對齊
struct A
{
char x; //aligned on byte boundary 0
int y; //aligned on byte boundary 1
}a;
sizeof(a)==5
(2)
#pragma pack(2) //每個變數按照2位元組對齊
struct A
{
char x; //aligned on byte boundary 0
int y; //aligned on byte boundary 2
}a;
sizeof(a)==6
(3)
#pragma pack(4) //每個變數按照4位元組對齊
struct A
{
char x; //aligned on byte boundary 0
int y; //aligned on byte boundary 4
}a;
sizeof(a)==8(4)
#pragma pack() //預設,相當於#pragma pack(8) 每個變數按照8位元組對齊
struct A
{
char x; //aligned on byte boundary 0
int y; //aligned on byte boundary 4
}a;
sizeof(a)==8
但是這裡y的大小是4位元組,所以不會按照8位元組對齊,否則將造成1個int空間的浪費
三.#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
1. 在VC6.0中定義類CXMLError的標頭檔中起始處有如下#include語句
#include <comdef.h>
#include <string>
class CXMLError
{
…
}
在使用Level 4編譯時間,報告C4100,C4511,C4512,C4663,C4245,C4018幾種Warning
2. 修改為如下:
#pragma warning( push )
#pragma warning( disable : 4100 4511 4512 4663 4245 4018)
#include <comdef.h>
#include <string>
#pragma warning( pop )
這時產生了大量C4514警告。
3. 再修改為
#pragma warning( push )
#pragma warning( disable : 4100 4511 4512 4663 4245 4018 4514)
#include <comdef.h>
#include <string>
#pragma warning( pop )
結果依然如上,有大量C4514警告,少量4663,4245,4108。
4. 再修改如下:
#pragma warning( disable : 4100 4511 4512 4663 4245 4018 4514)
#pragma warning( push )
#include <comdef.h>
#include <string>
#pragma warning( pop )
結果只餘下4663, 4245, 4108
由於不能去除4663, 4245, 4108三種警告
5. 又對包含標頭檔修改為在Level 3編譯,如下:
#pragma warning( disable:4514)
#pragma warning( push,3 )
#include <comdef.h>
#include <string>
#pragma warning( pop)
結果無警告產生。
6. 又嘗試如下修改:
#include <comdef.h>
#pragma warning( push,3 )
#include <string>
#pragma warning( pop)
結果無警告產生。
小結:
1. 在防止包含標頭檔引起的Warning而使用#pragma warning時,應只針對產生警告的標頭檔進行處理,在這個問題中是<string>,這時應該在#include <string>上面加#pragma warning(push),否則可能增加其它警告,如此處產生的大量C4514
2. 在使用#pragma warning(push)後使用#pragma warning(disable: xxxx)可能無效時,可以嘗試交換兩個語句的順序,這可能是VC6.0中的#pragma warning的Bug。
3. 在VC6.0中存在一些不能diable掉的Warning,如4663, 4245, 4108等。這可能是VC6.0的Bug,如已知的C4786在VC6.0中不能disable掉,使用#pragma warning(disable : 4786)之後仍然會顯示警告。
文章出處:http://www.diybl.com/course/3_program/vc/vc_js/200896/139249.html warning指令
該指令允許有選擇性的修改編譯器的警告訊息的行為
指令格式如下:
#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...]
#pragma warning( push[ ,n ] )
#pragma warning( pop )
主要用到的警告表示有如下幾個:
once:只顯示一次(警告/錯誤等)訊息
default:重設編譯器的警告行為到預設狀態
1,2,3,4:四個警告層級
disable:禁止指定的警告資訊
error:將指定的警告資訊作為錯誤報表
如果大家對上面的解釋不是很理解,可以參考一下下面的例子及說明
#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等價於:
#pragma warning(disable:4507 34) // 不顯示4507和34號警告資訊
#pragma warning(once:4385) // 4385號警告資訊僅報告一次
#pragma warning(error:164) // 把164號警告資訊作為一個錯誤。
同時這個pragma warning 也支援如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
這裡n代表一個警告層級(1---4)。
#pragma warning( push )儲存所有警告資訊的現有的警告狀態。
#pragma warning( push, n)儲存所有警告資訊的現有的警告狀態,並且把全域警告
等級設定為n。
#pragma warning( pop )向棧中彈出最後一個警告資訊,在入棧和出棧之間所作的
一切改動取消。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
#pragma warning( pop )
在這段代碼的最後,重新儲存所有的警告資訊(包括4705,4706和4707)
在使用標準C++進行編程的時候經常會得到很多的警告資訊,而這些警告資訊都是不必要的提示,
所以我們可以使用#pragma warning(disable:4786)來禁止該類型的警告
在vc中使用ADO的時候也會得到不必要的警告資訊,這個時候我們可以通過
#pragma warning(disable:4146)來消除該類型的警告資訊
二:#pragma pack()
註:如果設定的值比結構體中位元組最長的類型還要大,則這個變數(注意僅針對這一個變數)只按照它的位元組長度對齊,即不會出現記憶體浪費的情況。請參見(4)。
(1)
#pragma pack(1) //每個變數按照1位元組對齊
struct A
{
char x; //aligned on byte boundary 0
int y; //aligned on byte boundary 1
}a;
sizeof(a)==5
(2)
#pragma pack(2) //每個變數按照2位元組對齊
struct A
{
char x; //aligned on byte boundary 0
int y; //aligned on byte boundary 2
}a;
sizeof(a)==6
(3)
#pragma pack(4) //每個變數按照4位元組對齊
struct A
{
char x; //aligned on byte boundary 0
int y; //aligned on byte boundary 4
}a;
sizeof(a)==8(4)
#pragma pack() //預設,相當於#pragma pack(8) 每個變數按照8位元組對齊
struct A
{
char x; //aligned on byte boundary 0
int y; //aligned on byte boundary 4
}a;
sizeof(a)==8
但是這裡y的大小是4位元組,所以不會按照8位元組對齊,否則將造成1個int空間的浪費
三.#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
1. 在VC6.0中定義類CXMLError的標頭檔中起始處有如下#include語句
#include <comdef.h>
#include <string>
class CXMLError
{
…
}
在使用Level 4編譯時間,報告C4100,C4511,C4512,C4663,C4245,C4018幾種Warning
2. 修改為如下:
#pragma warning( push )
#pragma warning( disable : 4100 4511 4512 4663 4245 4018)
#include <comdef.h>
#include <string>
#pragma warning( pop )
這時產生了大量C4514警告。
3. 再修改為
#pragma warning( push )
#pragma warning( disable : 4100 4511 4512 4663 4245 4018 4514)
#include <comdef.h>
#include <string>
#pragma warning( pop )
結果依然如上,有大量C4514警告,少量4663,4245,4108。
4. 再修改如下:
#pragma warning( disable : 4100 4511 4512 4663 4245 4018 4514)
#pragma warning( push )
#include <comdef.h>
#include <string>
#pragma warning( pop )
結果只餘下4663, 4245, 4108
由於不能去除4663, 4245, 4108三種警告
5. 又對包含標頭檔修改為在Level 3編譯,如下:
#pragma warning( disable:4514)
#pragma warning( push,3 )
#include <comdef.h>
#include <string>
#pragma warning( pop)
結果無警告產生。
6. 又嘗試如下修改:
#include <comdef.h>
#pragma warning( push,3 )
#include <string>
#pragma warning( pop)
結果無警告產生。
小結:
1. 在防止包含標頭檔引起的Warning而使用#pragma warning時,應只針對產生警告的標頭檔進行處理,在這個問題中是<string>,這時應該在#include <string>上面加#pragma warning(push),否則可能增加其它警告,如此處產生的大量C4514
2. 在使用#pragma warning(push)後使用#pragma warning(disable: xxxx)可能無效時,可以嘗試交換兩個語句的順序,這可能是VC6.0中的#pragma warning的Bug。
3. 在VC6.0中存在一些不能diable掉的Warning,如4663, 4245, 4108等。這可能是VC6.0的Bug,如已知的C4786在VC6.0中不能disable掉,使用#pragma warning(disable : 4786)之後仍然會顯示警告。
文章出處:http://www.diybl.com/course/3_program/vc/vc_js/200896/139249.html