一、介紹
#pragma 是乙個很強大的預處理指令
二、用法
用法格式: #pragma 引數
常用引數:
1、once
2、pack
3、message
4、alloc_text
5、comment
6、optimize
7、auto_inline
8、component
9、inline_depth
10、init_seg*
11、bss_seg
12、data_seg
13、code_seg
14、const_seg
15、check_stack
16、inline_recursion
17、pointers_to_members*
18、function
19、intrinsic
20、setlocale
21、hdrstop
22、vtordisp*
23、include_alias
24、warning
三、示例
1、#progma once指定該檔案在編譯源**檔案時僅由編譯器包含(開啟)一次
#pragma once
#ifndef _hello_h_
#define _hello_h_
//**宣告
#endif
2、#pragma pack指定記憶體對齊方式
對齊方式必須是2的冪次方,即1、2、4、8、16等
#pragma pack(show) 以警告資訊的形式顯示當前位元組對齊的值.
#pragma pack(n) 將當前位元組對齊值設為 n .
#pragma pack() 將當前位元組對齊值設為預設值(通常是8) .
#pragma pack(push) 將當前位元組對齊值壓入編譯棧棧頂.
#pragma pack(pop) 將編譯棧棧頂的位元組對齊值彈出並設為當前值.
#pragma pack(push, n) 先將當前位元組對齊值壓入編譯棧棧頂, 然後再將 n 設為當前值.
#pragma pack(pop, n) 將編譯棧棧頂的位元組對齊值彈出, 然後丟棄, 再將 n 設為當前值.
#pragma pack(push, identifier) 將當前位元組對齊值壓入編譯棧棧頂, 然後將棧中儲存該值的位置標識為 identifier .
#pragma pack(pop, identifier) 將編譯棧棧中標識為 identifier 位置的值彈出, 並將其設為當前值. 注意, 如果棧中所標識的位置之上還有值, 那會先被彈出並丟棄.
#pragma pack(push, identifier, n) 將當前位元組對齊值壓入編譯棧棧頂, 然後將棧中儲存該值的位置標識為 identifier, 再將 n 設為當前值.
#pragma pack(pop, identifier, n) 將編譯棧棧中標識為 identifier 位置的值彈出, 然後丟棄, 再將 n 設為當前值. 注意, 如果棧中所標識的位置之上還有值, 那會先被彈出並丟棄.
例如下:2位元組對齊
#pragma pack(2)
struct test1
;#pragma pack()
不對其的時候,也可以寫成這樣
struct student
__attribute__ (
(packed)
);
結構體預設在windows上是4位元組對齊
因為設定2位元組對齊,c1 1位元組 c2 1位元組 i4位元組 一共6位元組
預設4位元組的話
struct test1
;
c1 1位元組 c2 1位元組 i 4位元組 c1 + c2一共2位元組不足4位元組,所以會補齊2位元組一共4+4=8位元組
位元組對齊的好處是cpu訪問速度更快,當設定不對其的話會訪問多次才能取完值
位元組不對其的好處是方便計算長度,特別是協議的處理或者協議棧的設計中會經常不對其
3、#pragma message自定義列印編譯資訊
示例1:
#define en 1
#if en == 1
#pragma message("en ==1")
#endif
示例2:
#pragma message( "compiling " __file__ )
//顯示被編譯的檔案
#pragma message( "last modified on " __timestamp__ )
//檔案最後一次修改的日期和時間
示例3:
#define string2(x) #x
#define string(x) string2(x)
#pragma message (__file__ "[" string(__line__) "]: test")
//注意把行號轉成了字串
預留剩下的 C語言預處理指令
一 預處理的由來 在c 的歷史發展中,有很多的語言特徵 特別是語言的晦澀之處 來自於c語言,預處理就是其中的乙個。c 從c語言那裡把c語言預處理器繼承過來 c語言預處理器,被bjarne博士簡稱為cpp,不知道是不是c program preprocessor的簡稱 二 常見的預處理功能 預處理器的...
C語言預處理指令
預處理指令 1.程式的編譯過程 編譯器將c語言源 變異成可執行程式是通過以下幾個步驟完成的 1 預處理 處理 中的預處理指令 以 開頭的 gcc e c o i 2 編譯 將源 編譯成彙編指令 gcc s i 3 彙編 將彙編指令變異成目標檔案 gcc c s 4 鏈結 將目標檔案 可能有多個 連線...
C語言基礎 預處理指令
在編譯前進行解析處理的指令 源 編譯預處理 編譯 鏈結 執行 編譯預處理指令 1.巨集定義 define 1.1 不帶引數的巨集定義 1.2 帶引數的巨集定義 2.條件編譯 3.檔案包含 include 編譯預處理指令 1.所有的編譯預處理指令都是以 號開頭 2.所有的編譯預處理指令都不需要分號 巨...