宏的幾種特殊用法
1. 屏蔽“未使用參數”警告
在OceanBase中ob_define.h中就使用了這種宏,將傳入的數據強製轉化為void型。
#ifndef UNUSED #define UNUSED(v) ((void)(v)) #endif
這種宏主要是為了屏蔽“未使用參數”的警告,如下麵這個函數用兩個參數,但是一個都不用的話,某些編譯器就會報出警告:認為p和mod_id都沒有使用。所有我們使用UNUSE
宏,這樣兩個參數都被使用了,但是實際上沒有做任何有效的動作,以此來屏蔽“未使用參數”警告。
virtual void mod_free(void* p, const int32_t mod_id = 0) { UNUSED(p); UNUSED(mod_id); }
2. 指定字節對齊
在缺省情況下,編譯器為每一個變量或是數據單元按其自然對界條件分配空間。一般地,可以通過下麵的方法來改變缺省的對界條件:
1) 使用偽指令#pragma pack (n)
,編譯器將按照n個字節對齊。
2) 使用偽指令#pragma pack ()
,取消自定義字節對齊方式。
另外,還有如下的一種方式:
3) __attribute__((aligned (n)))
,讓所作用的結構成員對齊在n字節自然邊界上。如果結構中有成員的長度大於n,則按照最大成員的長度來對齊。
4) __attribute__ ((packed))
,取消結構在編譯過程中的優化對齊,按照實際占用字節數進行對齊。
以上的n = 1, 2, 4, 8, 16... 第一種方式較為常見。
#define CACHE_ALIGNED __attribute__((aligned(CACHE_ALIGN_SIZE)))
3. 可變參數宏
我們指定,有些函數的參數是可變的,例如printf函數,指定第一個為格式化字符串以後,後麵可以跟個數不定的參數,同樣,宏也可以指定多個參數。有兩種方法可以做到。
一是使用args...
和##args
,二是使用...
和__VA_ARGS__
。下麵是兩種方式定義的兩個宏,這兩個宏都能在printf字符串前,先輸出一個字符串,達到相同的效果。
#define P_Debug(format,args...) \ {\ printf("[DeBug]");\ printf(format,##args);\ }while(false) #define P_Release(format,...) \do{\ printf("[Release]");\ printf(format,__VA_ARGS__);\ }while(false)
使用的時候為:
P_Debug("%s:%d\n","good",100); P_Release("%s:%d\n","good",100);
4. #
,##
,#@
的區別
假設定義3個宏,
#define A(x) T_##x #define B(x) #@x #define C(x) #x
則下麵展開後為
A(1)------>T_1
B(1)------>'1'
C(1)------>"1"
歡迎光臨我的網站----蝴蝶忽然的博客園----人既無名的專欄。
如果閱讀本文過程中有任何問題,請聯係作者,轉載請注明出處!
最後更新:2017-04-03 05:38:54
上一篇:
How can I detect the Android runtime (Dalvik or ART)?
下一篇:
java項目管理工具maven使用初級
CSS3實現京東圖片鼠標滑過流光效果
《數據驅動安全:數據安全分析、可視化和儀表盤》一第3章
從工作流狀態機實踐中總結狀態模式使用心得
學習ASP.NET Core, 怎能不了解請求處理管道[4]: 應用的入口——Startup
ECS服務器部署Nodejs出現錯誤Error: Listen EADDRNOTAVAIL
String、StringBuffer、StringBuilder的區別
Cocos2dx 3.0 過渡篇(五) 隨機數的獲取
獲取assert文件路徑
《Docker生產環境實踐指南》——2.5 部署
單例模式--餓漢式、懶漢式、線程安全的懶漢式、高性能安全的懶漢式