#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 這個也可...