最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中#pragma預處理指令的使用

 更新時間:2023年12月20日 11:55:04   作者:進擊的橫打  
在所有的預處理指令中,#pragma指令可能是最復雜的了,它的作用是設定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作,本文主要介紹了C語言中#pragma預處理指令的使用,感興趣的可以了解一下

一. pragma預處理指令概念

在所有的預處理指令中,#pragma指令可能是最復雜的了,它的作用是設定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作。

二. pragma預處理指令的作用

#pragma指令對每個編譯器給出了一個方法,在保持與C和C++語言完全兼容的情況下,給出主機或操作系統(tǒng)專有的特征。依據定義,編譯指示是機器或操作系統(tǒng)專有的,且對于每個編譯器都是不同的。

#pragma為編譯器提供了一種在不同機器和操作系統(tǒng)上編譯以保持C和C++完全兼容的方法。

三. 預處理指令的參數

其格式一般為: #pragma para 其中para為參數,下面來看一些常用的參數。

1)message參數

message參數是我最喜歡的一個參數,它能夠在編譯信息輸出窗口中輸出相應的信息,這對于源代碼信息的控制是非常重要的。其使用方法為:

#pragma  message("HELLO WORLD") 

message參數應用
當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本打印出來。 當我們在程序中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在源代碼的什么地方定義了_X86這個宏,可以用下面的方法:

#ifdef  _X86  
#pragma  message("_X86  macro  activated!")  
#endif  

我們定義了_X86這個宏以后,應用程序在編譯時就會在編譯輸出窗口里顯示X86 macro activated。我們就能夠記得自己定義的一些特定的宏了。

2)code_seg參數

它是另一個使用得比較多的pragma參數,格式如:

#pragma code_seg( [ [ { push | pop}, ] [ identifier, ] ] [ "segment-name" [, "segment-class" ] ) 

它能夠設置程序中函數代碼存放的代碼段,當我們開發(fā)驅動程序的時候就會使用到它。
push (可選參數)將一個記錄放到內部編譯器的堆棧中,可選參數可以為一個標識符或者節(jié)名;
pop (可選參數)將一個記錄從堆棧頂端彈出,該記錄可以為一個標識符或者節(jié)名;
identifier (可選參數)當使用push指令時,為壓入堆棧的記錄指派的一個標識符,當該標識符被刪除的時候和其相關的堆棧中的記錄將被彈出堆棧;
segment-name (可選參數)表示函數存放的節(jié)名。

//默認情況下,函數被存放在.text節(jié)中
void func1() {                  // stored in .text
}

//將函數存放在.my_data1節(jié)中
#pragma code_seg(".my_data1")
void func2() {                  // stored in my_data1
}

//r1為標識符,將函數放入.my_data2節(jié)中
#pragma code_seg(push, r1, ".my_data2")
void func3() {                  // stored in my_data2
}

int main() {
}

3)once參數

#pragma once 用于保證頭文件只被編譯一次
#pragma once也是編譯器相關的,不一定被支持
#pragma once的效率比使用#ifndef更高。
由于有些編譯器支持 #pragma once,有些不支持,怎么做既能保證高效又能保證多個編譯器之間可以通用呢,可以混合使用 #ifndef 和 #pragma once

4)pack參數

它就是用于指定內存對齊方式。編譯器在默認情況下按照 4 字節(jié)對齊,也就是說如果 #pragma pack() 不寫,則和 #pragma pack(4) 效果是相同的
這里是針對32位系統(tǒng),對于64位系統(tǒng)而言,默認情況下按照8字節(jié)對齊。
許多實際的計算機系統(tǒng)對基本類型數據在內存中存放的位置有限制,它們會要求這些數據的首地址的值是某個數k(通常它為4或8)的倍數,這就是所謂的內存對齊,而這個k則被稱為該數據類型的對齊模數(alignment modulus)。
Win32平臺下的微軟C編譯器(cl.exe for 80x86)在默認情況下采用如下的對齊規(guī)則: 任何基本數據類型T的對齊模數就是T的大小,sizeof(T)。比如對于double類型(8字節(jié)),就要求該類型數據的地址總是8的倍數,而char類型數據(1字節(jié))則可以從任何一個地址開始。

5) section指令參數

#pragma section指令可用于創(chuàng)建一個自定義分區(qū),可以將全局變量或者函數放在這個自定義分區(qū)內部,實現各個模塊之間的數據共享。
對于GNU C/C++編譯器來說,直接使用__attribute__((section(“xxx”)))對變量或函數進行修飾即可自動創(chuàng)建好分區(qū),將變量和函數放入對應分區(qū)。而在windows 的VC編譯器下,必須結合#pragma section和__declspec(allocate(“xxx”))兩個指令才能實現該功能。

6)warning(…)參數

啟用編譯器警告消息的行為和選擇性修改,語法為:

#pragma warning( disable : 4507 34; once : 4385; error : 164 )   //這1行跟下面3行效果一樣

#pragma warning( disable : 4507 34 ) 	//不發(fā)出4507和34警告,即有4507和34警告時不顯示
#pragma warning( once : 4385 )  		//4385警告信息只報告一次
#pragma warning( error : 164 )  		//把164警告信息作為一個錯誤

warning( push )指令存儲每個警告的當前警告狀態(tài)。
warning( push, n)指令存儲每個警告的當前狀態(tài)并將全局警告級別設置為 n。warning( pop )指令 彈出推送到堆棧上的最后一個警告狀態(tài)。
在push和pop之間對警告狀態(tài)所做的任何更改都將被撤消。
當你編寫頭文件時,你能用push和pop來保證任何用戶修改的警告狀態(tài)不會影響正常編譯你的頭文件。在頭文件開始的地方使用push,在結束地方使用pop。
在使用標準C++進行編程的時候經常會得到很多的警告信息,而這些警告信息都是不必要的提示,所以我們可以使用#pragma warning(disable:xxxx)來禁止該類型的警告。

7)comment參數

#pragma comment(comment-type [,“commentstring”])

該指令將一個注釋記錄放入一個對象文件或可執(zhí)行文件中。
comment-type 是一個預定義的標識符(如下所述,一共5個),它指定了注釋記錄的類型。 可選 commentstring 是一個字符串,它提供了某些注釋類型的附加信息。 由于 commentstring 是一個字符串,因此它遵循有關轉義字符、嵌入的引號 (") 和串聯的字符串的所有規(guī)則。

8)其他pragma的參數

#pragma resource ".dfm"表示把.dfm文件中的資源加入工程。*.dfm中包括窗體外觀的定義。
#pragma hdrstop表示預編譯頭文件到此為止,后面的頭文件不進行預編譯。

四. 預處理指令的總結

#pragma用于指示編譯器完成一些特定的動作
#pragma所定義的很多指示字是編譯器特有的(后面的參數決定)
#pragma在不同的編譯器間是不可移植的
預處理器將忽略它不認識的#pragma指令
不同編譯器可能以不同的方式解釋同一條 #pragma指令

到此這篇關于C語言中#pragma預處理指令的使用的文章就介紹到這了,更多相關C語言 #pragma預處理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Qt編寫提示進度條的實現示例

    Qt編寫提示進度條的實現示例

    進度條在很地方都可以使用到,Qt自帶的進度條或者操作系統(tǒng)的進度條樣式,不夠炫,本文就介紹一下Qt編寫自定義控件的提示進度條的實現示例,感興趣的可以了解一下
    2021-12-12
  • C++設計模式之職責鏈模式

    C++設計模式之職責鏈模式

    這篇文章主要介紹了C++設計模式之職責鏈模式,本文講解了什么是職責鏈模式、什么場合下使用、代碼實例等內容,需要的朋友可以參考下
    2014-10-10
  • c++11封裝thread庫的方法示例

    c++11封裝thread庫的方法示例

    C++11 ,封裝了thread的多線程的類,這樣對多線程的使用更加方便。下面這篇文章主要給大家介紹了關于c++11封裝thread庫的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2019-01-01
  • C語言實現貪吃蛇游戲

    C語言實現貪吃蛇游戲

    這篇文章主要為大家詳細介紹了C語言實現貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • C語言數據結構之隊列算法詳解

    C語言數據結構之隊列算法詳解

    這篇文章介紹了C語言數據結構之隊列的算法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • C語言編程大小端問題示例詳解教程

    C語言編程大小端問題示例詳解教程

    這篇文章主要為大家介紹了C語言編程大小端問題解決的示例內容詳解教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • C++使用BitBlt進行窗口抓圖的方法

    C++使用BitBlt進行窗口抓圖的方法

    這篇文章主要介紹了C++使用BitBlt進行窗口抓圖的方法,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2021-01-01
  • visual studio 建立dll類型工程、控制臺程序

    visual studio 建立dll類型工程、控制臺程序

    這篇文章主要介紹了visual studio 建立dll、控制臺類型工程的相關知識,感興趣的朋友跟隨腳本之家小編一起學習吧
    2018-05-05
  • 一起來學習C++中remove與erase的理解

    一起來學習C++中remove與erase的理解

    這篇文章主要為大家詳細介紹了C++的remove與erase,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言數據的存儲和取出詳細講解

    C語言數據的存儲和取出詳細講解

    這篇文章主要介紹了C語言數據的存儲和取出詳細講解,作者使用圖文代碼實例講解,有感興趣的同學可以學習研究下
    2021-02-02

最新評論

顺昌县| 浮梁县| 新营市| 太仓市| 长武县| 嫩江县| 师宗县| 海盐县| 浦城县| 淮阳县| 天峻县| 北辰区| 化德县| 井陉县| 日喀则市| 锡林浩特市| 大名县| 淮安市| 张北县| 巴林左旗| 宝应县| 公主岭市| 万全县| 丰都县| 凌云县| 闻喜县| 基隆市| 阳江市| 岱山县| 罗江县| 子洲县| 大埔县| 侯马市| 诸城市| 浪卡子县| 阿克| 岗巴县| 葫芦岛市| 乐山市| 宽甸| 屏东市|