C語言高階 24 pragma使用分析

2021-08-20 03:44:01 字數 3246 閱讀 7048

#pragma用於指示完成一些特定的動作,並且所定義的很多指示字是編譯器特有的。

#pragma在不同的編譯器間是不可移植的

——預處理器將忽略它不認識的#pragma指令

——不同的編譯器可能以不同的方式解釋一條#pragma指令。

一般用法:

#pragma parameter

注:不同的parameter引數語法和意義各不相同

message引數在大多數的編譯器中都有相似的實現;

message引數在編譯時輸出訊息到編譯輸出視窗中。

與#error和#warning不同,#pragma message僅僅代表一條編譯訊息,不代表程式錯誤。

#include #if defined(android20)

#pragma message("compile android sdk 2.0...")

#define version "android 2.0"

#elif defined(android23)

#pragma message("compile android sdk 2.3...")

#define version "android 2.3"

#elif defined(android40)

#pragma message("compile android sdk 4.0...")

#define version "android 4.0"

#else

#error compile version is not provided!

#endif

int main()

在linux下使用gcc進行編譯:

~/will$ gcc 24-1.c   //直接編譯

24-1.c:13: error: #error compile version is not provided!

24-1.c: in function 『main』:

24-1.c:18: error: 『version』 undeclared (first use in this function)

24-1.c:18: error: (each undeclared identifier is reported only once

~/will$

~/will$

~/will$ gcc -dandroid23 24-1.c // 條件編譯

24-1.c:7: note: #pragma message: compile android sdk 2.3... //與vc不同的是,bcc和gcc將 #pragma message: 列印出來

~/will$

~/will$

~/will$ ./a.out //執行

android 2.3

#pragma once#pragma once 用於保證標頭檔案紙杯編譯一次;

#pragma once 是編譯器相關,不一定被支援。

pragma once是部分編譯器支援;預處理器遇見pragma once後將直接忽略再次出現的標頭檔案

#pragma pack  記憶體對齊

——不同型別的資料在記憶體中按照一定的規則排列

——而不一定是順序的乙個接乙個的排列

為什麼需要記憶體對齊?

——cpu對記憶體的讀取不是連續的,而是分成塊讀取的,快的大小只能是1,2,4,8,16...位元組;

——當讀取操作的資料未對齊,則需要兩次匯流排週期來訪問記憶體,因此效能會大打折扣;

——某些硬體平台只能從規定的相對位址處讀取特定型別的資料,否則產生硬體異常。

#pragma pack用於指定「記憶體對齊」方式。

#include #pragma pack(4)

struct test1

;#pragma pack()

#pragma pack(4)

struct test2

;#pragma pack()

int main()

編譯執行:

~/will$ ./a.out

sizeof(test1) = 12

sizeof(test2) = 8

gcc編譯器暫時不支援8位元組對齊

struct占用的記憶體大小:

——第乙個成員起始於0偏移處;

——每個成員按其型別大小和pack引數中較小的乙個進行對齊;

偏移位址必須能被對齊引數整除

結構體成員的大小取其內部長度最大的資料成員作為其大小;

結構體總長度必須為所有對齊引數的整數倍

注意:編譯器在預設情況下按照4位元組對齊。

#include #pragma pack(8)

struct s1

;struct s2

;#pragma pack()

int main()

gcc編譯器暫時不支援8位元組對齊,輸出為

8

20

在vc編譯器支援8位元組對齊,輸出為

8

24

小結:

#pragma用於指示編譯器完成一些特定的動作

#pragma所定義的很多指示字是編譯器特有

——#pragma message用於自定義編譯訊息

——#pragma once用於保證標頭檔案只被編譯一次

——#pragma pack用於指定記憶體對齊方式

C 24 pragma 使用分析

一般用法 pragma parameter 注 不同的 parameter 引數語法和意義各不相同 c 語言預留給編譯器廠商的擴充套件指示字 if defined android20 pragma message compile android sdk 2.0 define version andr...

c 語言中的pragma使用

pragma 常用於網路程式設計中自定義協議,指定結構體成員的位元組對齊,當沒有指定pragma時,程式會按照結構體中最長的變數進行位元組的對齊 而使用pragma後,程式會先判斷 pragma 定義的大小與結構體中最長變數的大小 取二者較小的進行位元組對齊。struct foo char c1 s...

C語言中 pragma用法 彙總

前一段時間寫函式中斷時,經常要加上 pragma語句,否則,編譯就會出錯。有飛思卡爾的16位微控制器寫過中斷函式的人,就會知道在中斷函式前必須加上 pragma code seg near seg non banked 函式結束的時候最好加上 pragma code seg default 這個也可...