使用 C 定义来简化常量定义?

Dan*_*jel 4 c

我有以下定义:

#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)

tst*_*isl 5

您可以在两者之间使用额外的宏,从排列中选择适当的参数。排列本身就是一个可以未定义和重新定义的宏。

#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)