糯米文學吧

位置:首頁 > 計算機 > C語言

C語言#pragma指令用法

C語言1.62W

引導語:在所有的預處理指令中,#Pragma指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。以下是本站小編分享給大家的C語言#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")

標籤:pragma 指令 語言