C語言pragma用法詳解

2021-03-03 23:17:19 字數 4625 閱讀 6181

目錄:(0) 前言

(1) #pragma message能夠在編譯資訊輸出視窗中輸出相應的資訊

(2) #pragma code_seg能夠設定程式中函式**存放的**段,開發驅動程式的時會用到

(3) #pragma once若用在標頭檔案的最開始處就能夠保證標頭檔案被編譯一次

(4) #pragma hdrstop表示預編譯標頭檔案到此為止

(5) #pragma resource "*.dfm"表示把*.dfm檔案中的資源加入工程

(6) #pragma warning允許有選擇性的修改編譯器的警告訊息的行為

(7) #pragma ***ment將乙個注釋記錄放入乙個物件檔案或可執行檔案中

(8) #pragma data_seg建立乙個新的資料段並定義共享資料

應用1:在dll中定義乙個共享的,有名字的資料段

應用2: data_seg控制應用程式的啟動次數

(9) 其他用法

(0)前言

#pragma 指令的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。#pragma 指令對每個編譯器給出了乙個方法,在保持與c和c++語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有的, 且對於每個編譯器都是不同的。

其格式一般為: #pragma para

其中para為引數,下面來看一些常用的引數。

(1) #pragma message引數能夠在編譯資訊輸出視窗中輸出相應的資訊

這對於源**資訊的控制是非常重要的。其使用方法為: pragma message(「訊息文字」)

當我們在程式中定義了許多巨集來控制源**版本的時候,我們自己有可能都會忘記有沒有正確的設定這些巨集,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在源**的什麼地方定義了_x86這個巨集可以用下面的方法

ifdef _x86

pragma message(「_x86 macro activated!」)

endif

若定義了_x86,程式編譯時就會在顯示「_x86 macro activated!」。我們就不會因為不記得自己定義的一些特定的巨集而抓耳撓腮了 。

(2) #pragma code_seg能夠設定程式中函式**存放的**段,

開發驅動程式的時候就會使用到它。格式如下:

pragma code_seg( [ [ , ] [ identifier, ] ][ "segment-name" [, "segment-class" ] ])

該指令用來指定函式在.obj檔案中存放的節,觀察obj檔案可以使用vc自帶的dumpbin命令列程式 ,如果code_seg沒有帶引數的話,則函式在obj檔案中存放在預設在.text節中。

push (可選引數) 將乙個記錄放到內部編譯器的堆疊中,可選引數可以為乙個識別符號或者節名

pop(可選引數) 將乙個記錄從堆疊頂端彈出,該記錄可以為乙個識別符號或者節名

identifier (可選引數) 當使用push指令時,為壓入堆疊的記錄指派的乙個識別符號,當該識別符號被刪除的時候和其相關的堆疊中的記錄將被彈出堆疊

"segment-name" (可選引數) 表示函式存放的節名

例如:預設情況下,函式被存放在.text節中

void func1stored in .text

將函式存放在.my_data1節中

pragma code_seg(".my_data1")

void func2stored in my_data1

r1為識別符號,將函式放入.my_data2節中

pragma code_seg(push, r1, ".my_data2")

void func3stored in my_data2

int main() {}

(3)#pragma once (比較常用)若用在標頭檔案的最開始處就能夠保證標頭檔案被編譯一次.

一般在整個工程中我們只要包含標頭檔案一次就夠了,若多個.c/.cpp 檔案中都要包含同乙個標頭檔案,比如 windows.

h,那很多宣告等等豈不是有兩次了?解決這個問題的傳統的方法是在標頭檔案開始出用 #define 定義乙個巨集,比如 windows.h 中:

ifndef _windows_

define _windows_

endif

這樣就可以避免被包含多次。但是這樣的後果是**的可讀性較差 (個人觀點),vc給我們提供了另外乙個途徑,那就是在檔案的前面加上:

pragma once」

(4)#pragma hdrstop表示預編譯標頭檔案到此為止

後面的標頭檔案不進行預編譯。bcb可以預編譯標頭檔案以加快鏈結的速度,但如果所有標頭檔案都進行預編譯又可能占太多磁碟空間,所以使用這個選項排除一些標頭檔案.有時單元之間有依賴關係,比如單元a依賴單元b,所以單元b要先於單元a編譯。

你可以用#pragma startup指定編譯優先順序,如果使用了#pragma package(**art_init) ,bcb就會根據優先順序的大小先後編譯。

(5)#pragma resource "*.dfm"表示把*.dfm檔案中的資源加入工程。*.dfm中包括窗體外觀的定義。

(6) #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( 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)。

(7)pragma ***ment將乙個注釋記錄放入乙個物件檔案或可執行檔案中

該指令的格式為

#pragma ***ment( "***ment-type" [, ***mentstring] )

***ment-type(注釋型別):可以指定為五種預定義的識別符號的其中一種,五種預定義的識別符號為:

***piler:將編譯器的版本號和名稱放入目標檔案中,本條注釋記錄將被編譯器忽略,如果你為該記錄型別提供了***mentstring引數,編譯器將會產生乙個警告

例如:#pragma ***ment( ***piler )

exestr: 鏈結時,將***mentstring引數放入到可執行檔案中,當作業系統載入可執行檔案的時候,該引數字串不會被載入到記憶體中.但是,該字串可被 dumpbin之類的程式查詢出並列印出來,你可以用這個識別符號將版本號碼之類的資訊嵌入到可執行檔案中!

lib:用來將乙個庫檔案鏈結到目標檔案中

比如我們連線的時候用到了wsock32.lib,你當然可以不辭辛苦地把它加入到你的工程中。但是我覺得更方便的方法是使用#pragma指示符,指定要連線的庫:

#pragma ***ment(lib, "wsock32.lib")

linker:將乙個鏈結選項放入目標檔案中,你可以使用這個指令來代替由命令列傳入的或者在開發環境中設定的鏈結選項,你可以指定/include選項來強制包含某個物件,例如:

#pragma ***ment(linker, "/include:__mysymbol")

你可以在程式中設定下列鏈結選項

/defaultlib

/export

/include

/merge

/section

這些選項在這裡就不一一說明了,詳細資訊請看msdn!

user:將一般的注釋資訊放入目標檔案中***mentstring引數包含注釋的文字資訊,這個注釋記錄將被鏈結器忽略,例如:

#pragma ***ment( user, "***piled on " __date__ " at " __time__ )

C語言函式用法大全

函式名 stpcpy 功能 拷貝乙個字串到另乙個 用法 char stpcpy char destin,char source 程式例 include include int main void 函式名 strcat 功能 字串拼接函式 用法 char strcat char destin,char...

C語言基本資料型別整型int用法詳解

c語言基本資料型別 整型 int 用法詳解 1.整型int c 語言提供了很多整數型別 整型 這些整型的區別在於它們的取值範圍的大小,以及是否可以為負。int是整型之一,一般被稱為整型。以後,在不產生歧義的情況下,我們把整數型別和int都稱為整型。int代表有符號整數,也就是說,用int宣告的變數可...

C語言經典演算法詳解

分而治之方法與軟體設計的模組化方法非常相似。為了解決乙個大的問題,可以 1 把它分成兩個或多個更小的問題 2 分別解決每個小問題 3 把各小問題的解答組合起來,即可得到原問題的解答。小問題通常與原問題相似,可以遞迴地使用分而治之策略來解決。下列通過例項加以說明。例 利用分而治之演算法求乙個整數陣列中...