C語言預處理指令實列二 pragma

2021-10-21 20:34:21 字數 2614 閱讀 6298

一、介紹

#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.所有的編譯預處理指令都不需要分號 巨...