我有以下定義:
#define M(x) ( ((uint64_t) 1) << (x) )
#define Mx M(0)
#define My M(1)
#define Mz M(2)
我經常需要重新排列 Mx、My、Mz 的順序,例如:
#define My M(0)
#define Mz M(1)
#define Mx M(2)
從不必M(0/1/2)每次都更正的意義上說,我如何使這更通用,而只是洗牌?
#define POS ...
#define My M(POS)
#define Mz M(POS)
#define Mx M(POS)
uj5u.com熱心網友回復:
您可以在兩者之間使用額外的宏,從排列中選擇適當的引數。置換將是一個宏本身,可以未定義和重新定義。
#define NTH0(a0,a1,a2) a0
#define NTH1(a0,a1,a2) a1
#define NTH2(a0,a1,a2) a2
#define NTH(n, perm) NTH ## n (perm)
#define Mx M(NTH(0, PERM))
#define My M(NTH(1, PERM))
#define Mz M(NTH(2, PERM))
#define PERM 1,2,3
Mx
My
Mz
#undef PERM
#define PERM 3,2,1
Mx
My
Mz
用gcc -E它編譯時擴展為:
M(1)
M(2)
M(3)
M(3)
M(2)
M(1)
uj5u.com熱心網友回復:
最好的解決方案可能是使用版本控制或#ifdef開關而不是類似函式的宏來解決這個問題。或者也許通過腳本生成 C 源代碼。
否則,在避免代碼重復的同時列出內容的標準前處理器方法是“X 宏”,您只需要在一個地方更改值(M_LIST在本例中稱為):
#include <stdio.h>
#include <inttypes.h>
#define M_LIST(X) \
X(x,0) \
X(y,1) \
X(z,2) \
#define M_enum(symbol,val) M##symbol##_bit = val,
enum { M_LIST(M_enum) };
#define M(symbol) ( 1ull << (M##symbol##_bit) )
int main (void)
{
printf("%.16"PRIx64"\n", M(x));
printf("%.16"PRIx64"\n", M(y));
printf("%.16"PRIx64"\n", M(z));
}
這里創建了一個臨時列舉,它將擴展為:
enum { Mx_bit = 0, My_bit = 1, Mz_bit = 2, }。您的程式不直接使用這些常量,而只能通過宏M.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324802.html
標籤:C
上一篇:列印地址功能
