關於 pragma預處理指令的那些事

2021-09-03 08:20:02 字數 3467 閱讀 6892

#pragma一直是沒怎麼用,近日看同事寫的dll用到多次所以抽時間翻一下手冊,記錄一下。

#pragma region name

#pragma endregion comment 可以讓你摺疊特定的**塊,從而使介面更加清潔,便於編輯其他**。摺疊後的**塊不會影響編譯。你也可以隨時展開**塊以進行編輯等操作。

在這兩條指令中間輸入的**將會可折疊。在name和comment處分別可以輸入**塊的名字和注釋,這個功能其實用的比較多了,當**很龐大的時候,不摺疊找乙個特定功能塊實在是太費事。

#pragma hdrstop [( 「filename」 )]

#pragma hdrstop表示預編譯標頭檔案到此為止,後面的標頭檔案不進行預編譯。bcb可以預編譯標頭檔案以加快鏈結的速度,但如果所有標頭檔案都進行預編譯又可能占太多磁碟空間,所以使用這個選項排除一些標頭檔案。

有時單元之間有依賴關係,比如單元a依賴單元b,所以單元b要先於單元a編譯。你可以用#pragma startup指定編譯優先順序,如果使用了#pragma package(smart_init) ,bcb就會根據優先順序的大小先後編譯。

#pragma once 指定編譯源**檔案時編譯器僅包含(開啟)一次檔案。

使用#pragma once可以減少構建時間,因為編譯器不會#include在翻譯單元中的第乙個檔案之後開啟和讀取檔案。這被稱為多包含優化。它具有類似於#include guard的效果,它使用預處理器巨集定義來防止多次包含檔案內容。這也有助於防止違反乙個定義規則——要求所有模板,型別,函式和物件在**中只有乙個定義。

#pragma warning 警告的相關指定

關鍵字:

once:只顯示一次(警告/錯誤等)訊息

default:重置編譯器的警告行為到預設狀態

1,2,3,4:四個警告級別

disable:禁止指定的警告資訊

error:將指定的警告資訊作為錯誤報告

例如:#pragma warning(disable:4996)表示將4996警告關閉。

#pragma data_seg(「name」)…#pragma data_seg()

用於dll中,用於定義乙個共享的,有名字的資料段。命名的資料段中的全域性變數可以被多個程序共享,否則多個程序之間無法共享dll中的全域性變數。

例如:

#pragma data_seg(「flag_data」)

int count=0;

#pragma data_seg()

#pragma comment( comment-type [,「commentstring」] )該巨集放置乙個注釋到物件檔案或者可執行檔案。

comment-type是乙個預定義的識別符號,指定注釋的型別,應該是compiler,exestr,lib,linker之一。

1、compiler:放置編譯器的版本或者名字到乙個物件檔案,該選項是被linker忽略的。

2、exestr:在以後的版本將被取消。

3、lib:放置乙個庫搜尋記錄到物件檔案中,這個型別應該是和commentstring(指定你要liner搜尋的lib的名稱和路徑),這個庫的名字放在object檔案的預設庫搜尋記錄的後面,linker搜尋這個庫就像你在命令列輸入這個命令一樣。你可以在乙個原始檔中設定多個庫記錄,它們在object檔案中的順序和在原始檔中的順序一樣。

4、linker:指定乙個連線選項,這樣就不用在命令列輸入或者在開發環境中設定了。只有下列選項能設定linker:

/defaultlib:library

將乙個 library 新增到 link 在解析引用時搜尋的庫列表。

/export:entryname[,@ordinal[,noname]][,data]

使用該選項,可以從程式匯出函式,以便其他程式可以呼叫該函式。entryname 是呼叫程式要使用的函式或資料項的名稱。ordinal 在匯出表中指定範圍在 1 至 65,535 的索引;如果沒有指定 ordinal,則 link 將分配乙個。noname 關鍵字只將函式匯出為序號,沒有 entryname。

/include:symbol

/include 選項通知鏈結器將指定的符號新增到符號表。

若要指定多個符號,請在符號名稱之間鍵入逗號 (,)、分號 (; ) 或空格。在命令列上,對每個符號指定一次 /include:symbol。

/manifestdependency:manifest_dependency

允許您指定將放在清單檔案的部分中的屬性。例如:

#pragma comment(linker, "\"/manifestdependency:type='win32' name='test.research.sampleassembly' version='6.0.0.0' processorarchitecture='x86' publickeytoken='0000000000000000' language='*'\"")
效果如下:

/merge:from=to

將from和to部分連線起來,將結果命名為to。例如/merge:.rdata=.text

如to的部分不存在,link以from重新命名to。/ merge選項對於建立vxd和覆蓋編譯器生成的節名稱非常有用。

/section:name,[[!]][,align=number]

在/ section選項更改節的屬性,覆蓋在部分obj檔案編譯設定的屬性。

name指的是選擇節的名稱,該名稱是區分大小寫的。請勿使用以下名稱,因為它們與標準名稱衝突。例如,.sdata用於risc平台:

.arch .bss .data .edata .idata .pdata .rdata .reloc .rsrc .sbss .sdata .srdata .text .xdata

dekprsw為該部分指定乙個或多個屬性。下面列出的屬性字元不區分大小寫。您必須指定希望該部分具有的所有屬性; 省略的屬性字元會導致該屬性位被關閉。如果未指定r,w或e,則現有的讀取,寫入或可執行狀態保持不變。

要取消屬性,請在其字元前加上感嘆號(!)。屬性字元的含義如下表所示:

字元 屬性 含義

e execute 該部分是可執行的

r read 允許對資料讀操作

w write 允許對資料寫操作

s shared 在載入映像的所有程序中共享該部分

d discardable 將該部分標記為可廢棄

k cacheable 將該部分標記為不可快取

p pageable 將該部分標記為不可分頁

pe檔案中沒有設定e,r或w的部分可能無效。

align=number,為特定部分指定對齊值,number單位是位元組,必須是2的冪。

pragma 預處理指令

pragma 預處理指令詳解 在所有的預處理指令中,pragma 指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。pragma指令對每個編譯器給出了乙個方法,在保持與c和c 語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有...

pragma預處理指令

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

pragma 預處理指令

pragma 預處理指令 pragma 的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。其格式一般為 pragma para 其中para 為引數,下面來看一些常用的引數。1 message 引數。它能夠在編譯資訊輸出視窗中輸出相應的資訊,這對於源 資訊的控制是非常重要的。其使用方法為 ...