我有以下定义:
#define M(x) ( ((uint64_t) 1) << (x) )
Run Code Online (Sandbox Code Playgroud)
#define Mx M(0)
#define My M(1)
#define Mz M(2)
Run Code Online (Sandbox Code Playgroud)
很多时候我需要重新排列 Mx、My、Mz 的顺序,例如:
#define My M(0)
#define Mz M(1)
#define Mx M(2)
Run Code Online (Sandbox Code Playgroud)
我怎样才能使这个更加通用,不必M(0/1/2)每次都纠正,而只需打乱行的顺序?
#define POS ...
#define My M(POS)
#define Mz M(POS)
#define Mx M(POS)
Run Code Online (Sandbox Code Playgroud)
您可以在两者之间使用额外的宏,从排列中选择适当的参数。排列本身就是一个可以未定义和重新定义的宏。
#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
Run Code Online (Sandbox Code Playgroud)
当用它编译时,gcc -E它会扩展为:
M(1)
M(2)
M(3)
M(3)
M(2)
M(1)
Run Code Online (Sandbox Code Playgroud)