C語言#pragma指令用法
引導語:在所有的預處理指令中,#Pragma指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。以下是本站小編分享給大家的C語言#pragma指令用法,歡迎閱讀!
#pragma
#pragma GCC dependency 檔名
表示當前檔案依賴於指定的檔案,如果當前檔案的最後一次,修改的時間早於依賴的檔案,則產生警告資訊
#include
//當前程式依賴於01print.c檔案
#pragma GCC dependency "01print.c"
int main(void)
{
printf("Good Good Study,Day Day Up!n");
return 0;
}
輸出結果:
致命錯誤: 01print.c:沒有那個檔案或目錄
編譯中斷。
#pragma GCC poison 標示符
表示將後面的標示符設定成毒藥,一旦使用標示符,則產生錯誤或警告資訊
//毒藥的設定
#include
//#define GOTO goto
//將goto設定為毒藥
#pragma GCC poison goto
int main(void)
{
//GOTO ok;
goto ok;
printf("main函式開始n");
ok:
printf("main函式結束n");
return 0;
}
輸出結果:
錯誤: 試圖使用有毒的“goto”
#pragma pack (整數n)
表示按照整數n倍進行補齊和對齊
//設定結構體的對齊和補齊方式
#include
//設定結構體按照2的整數倍進行對齊補齊
#pragma pack(2) //8
//#pragma pack(1) //6
//#pragma pack(3) //error
//char short int long int long long
int main(void)
{
struct S
{
char c1;
int i;
char c2;
};
printf("sizeof(struct S) = %dn",sizeof(struct S));//12
return 0;
}
輸出結果:
sizeof(struct S) = 8
#pragma message
message 引數: message 引數是我最喜歡的一個引數,它能夠在編譯資訊輸出窗,口中輸出相應的資訊,這對於原始碼資訊的控制是非常重要的。其使用方法為:
#pragma message(“訊息文字”)
當編譯器遇到這條指令時就在編譯輸出視窗中將訊息文字打印出來。當我們在程式中定義了許多巨集來控制原始碼版本的時候,我們自己有可能都會忘記有沒有正確的設定這些巨集,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在原始碼的什麼地方定義了_X86 這個巨集可以用下面的方法.
#define _X86
#ifdef _X86
#pragma message ("_X86 macro activated!")
#endif
輸出結果:
附註: #pragma message:_X86 macro activated!
當我們定義了_X86 這個巨集以後,應用程式在編譯時就會在編譯輸出窗口裡顯示“_X86 macro activated!”。我們就不會因為不記得自己定義的一些特定的巨集而抓耳撓腮了.
#pragma code_seg
另一個使用得比較多的 pragma 引數是 code_seg。格式如:
#pragma code_seg( ["section-name"[,"section-class"] ] )
它能夠設定程式中函式程式碼存放的程式碼段,當我們開發驅動程式的時候就會使用到它。
#pragma once
#pragma once (比較常用)
只要在標頭檔案的最開始加入這條指令就能夠保證標頭檔案被編譯一次,這條指令實際上在Visual C++6.0 中就已經有了,但是考慮到相容性並沒有太多的使用它。
#pragma hdrstop
#pragma hdrstop 表示預編譯標頭檔案到此為止,後面的標頭檔案不進行預編譯。 BCB 可以預編譯標頭檔案以加快連結的速度,但如果所有標頭檔案都進行預編譯又可能佔太多磁碟空間,所以使用這個選項排除一些標頭檔案。有時單元之間有依賴關係,比如單元 A 依賴單元 B,所以單元 B 要先於單元 A 編譯。你可以用#pragma startup 指定編譯優先順序,如果使用了#pragma package(smart_init) , BCB就會根據優先順序的大小先後編譯。
#pragma resource
#pragma resource "*"表示把* 檔案中的資源加入工程。 * 中包括窗體外觀的'定義。
#pragma warning
#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)。
#pragma comment
#pragma comment(...)
該指令將一個註釋記錄放入一個物件檔案或可執行檔案中。常用的 lib 關鍵字,可以幫我們連入一個庫檔案。 比如:
#pragma comment(lib, "")
該指令用來將 庫檔案加入到本工程中。linker:將一個連結選項放入目標檔案中,你可以使用這個指令來代替由命令列傳入的或者在開發環境中設定的連結選項,你可以指定/include 選項來強制包含某個物件,例如:
#pragma comment(linker, "/include:__mySymbol")