pragma once 用法含意

2021-06-09 23:29:45 字數 4880 閱讀 7065

#pragma once 用法含意  

pragma指令簡介 

在編寫程式的時候,我們經常要用到#pragma指令來設定編譯器的狀態或者是指示編譯器完成一些特定的動作. 

下面介紹了一下該指令的一些常用引數,希望對大家有所幫助! 

一. message 引數。 

message 

它能夠在編譯資訊輸出窗 

口中輸出相應的資訊,這對於源**資訊的控制是非常重要的。其使用方法為: 

#pragma message(「訊息文字」) 

當編譯器遇到這條指令時就在編譯輸出視窗中將訊息文字列印出來。 

當我們在程式中定義了許多巨集來控制源**版本的時候,我們自己有可能都會忘記有沒有正確的設定這些巨集,此時我們可以用這條 

指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在源**的什麼地方定義了_x86這個巨集可以用下面的方法 

#ifdef _x86 

#pragma message(「_x86 macro activated!」) 

#endif 

當我們定義了_x86這個巨集以後,應用程式在編譯時就會在編譯輸出視窗裡顯示「_ 

x86 macro activated!」。我們就不會因為不記得自己定義的一些特定的巨集而抓耳撓腮了 

二. 另乙個使用得比較多的#pragma引數是code_seg。格式如: 

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

該指令用來指定函式在.obj檔案中存放的節,觀察obj檔案可以使用vc自帶的dumpbin命令列程式,函式在.obj檔案中預設的存放節 

為.text節 

如果code_seg沒有帶引數的話,則函式存放在.text節中 

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

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

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

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

例如: 

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

void func1()  

//將函式存放在.my_data1節中 

#pragma code_seg(".my_data1") 

void func2()  

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

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

void func3()  

int main()  

三. #pragma once (比較常用) 

這是乙個比較常用的指令,只要在標頭檔案的最開始加入這條指令就能夠保證標頭檔案被編譯一次 

四. #pragma hdrstop表示預編譯標頭檔案到此為止,後面的標頭檔案不進行預編譯。 

bcb可以預編譯標頭檔案以加快鏈結的速度,但如果所有標頭檔案都進行預編譯又可能占太多磁碟空間,所以使用這個選項排除一些標頭檔案。 

有時單元之間有依賴關係,比如單元a依賴單元b,所以單元b要先於單元a編譯。你可以用#pragma startup指定編譯優先順序, 

如果使用了#pragma package(smart_init) ,bcb就會根據優先順序的大小先後編譯。 

五. #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 comment(...) 

該指令的格式為 

#pragma comment( "comment-type" [, commentstring] ) 

該指令將乙個注釋記錄放入乙個物件檔案或可執行檔案中, 

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

五種預定義的識別符號為: 

compiler:將編譯器的版本號和名稱放入目標檔案中,本條注釋記錄將被編譯器忽略 

如果你為該記錄型別提供了commentstring引數,編譯器將會產生乙個警告 

例如:#pragma comment( compiler ) 

exestr:將commentstring引數放入目標檔案中,在鏈結的時候這個字串將被放入到可執行檔案中, 

當作業系統載入可執行檔案的時候,該引數字串不會被載入到記憶體中.但是,該字串可以被 

dumpbin之類的程式查詢出並列印出來,你可以用這個識別符號將版本號碼之類的資訊嵌入到可 

執行檔案中! 

lib:這是乙個非常常用的關鍵字,用來將乙個庫檔案鏈結到目標檔案中 

常用的lib關鍵字,可以幫我們連入乙個庫檔案。 

例如: 

#pragma comment(lib, "user32.lib") 

該指令用來將user32.lib庫檔案加入到本工程中 

linker:將乙個鏈結選項放入目標檔案中,你可以使用這個指令來代替由命令列傳入的或者在開發環境中 

設定的鏈結選項,你可以指定/include選項來強制包含某個物件,例如: 

#pragma comment(linker, "/include:__mysymbol") 

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

/defaultlib 

/export 

/include 

/merge 

/section 

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

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

例如: 

#pragma comment( user, "compiled on " __date__ " at " __time__ ) 

補充乙個 

#pragma pack(n) 

控制對齊 如 

#pragma pack(push) 

#pragma pack(1) 

struct s_1; 

#pragma pack(pop) 

struct s_2; 

則 printf("s_1 size : %d\n", sizeof(struct s_1)); 

printf("s_2 size : %d\n", sizeof(struct s_2)); 

得到5,8。 

例子檔案一

#include "stdafx.h"

#include "myc.h"

void printi()

檔案2#include "stdafx.h"

#include "myc.h"

int _tmain(int argc, _tchar* argv)

檔案三:.h檔案

#pragma once

const int global_i = 10;

pragma once 用法總結

1.pragmaonce這個巨集有什麼作用?為了避免同乙個標頭檔案被包含 include 多次,c c 中有兩種巨集實現方式 一種是 ifndef方式 另一種是 pragma once方式。在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別。但兩者仍然有一些細微的區別。2.兩者的使用方式有何區別?...

pragma once用法總結

在c c 中,在使用預編譯指令 include的時候,為了防止重複引用造成二義性,通常有兩種方式 第一種是 ifndef指令防止 塊重複引用,比如說 ifndef code block define code block code endif code block第二種就是 pragma once指...

pragma once含義及用法

pragma once是乙個比較常用的c c 雜注,只要在標頭檔案的最開始加入這條雜注,就能夠保證標頭檔案只被編譯一次。pragma once是編譯器相關的,有的編譯器支援,有的編譯器不支援,具體情況請檢視編譯器api文件,不過現在大部分編譯器都有這個雜注了。ifndef,define,endif是...