我有一堆#define
,由Visual Studio生成,其值无法控制。它们以3个为一组配对,例如
CFG_FILT0
CFG_FILT1
CFG_FILT2
CFG_DELTA0
CFG_DELTA1
CFG_DELTA2
...
在我正在使用的当前课程中,我希望有一个本地(private
和const
)结构,它封装了所有这些#define
。然后,这个类的一些函数需要读取这些值,但只能在前面提到的3个组中读取。潜在结构(myStruct
)应该允许这样的东西:
for (int idx = 0; chIdx < 3; idx++)
{
GetItem(myStruct[idx].filt)
GetItem(myStruct[idx].delta)
...
}
在可读性和内存使用方面,定义此类结构的最佳方法是什么?
请注意,我宁愿只有一个结构,而不是每个3 #define
组的一个结构(例如myStructFilt
,myStructDelta
,如上例所示)
答案 0 :(得分:1)
我并非100%确定这是您真正想要的,但您可以获得类似于下一个宏描述的访问界面:
#define GET(kind, idx) ( \
(idx) == 0 ? CFG_ ## kind ## 0 \
: (idx) == 1 ? CFG_ ## kind ## 1 \
: (idx) == 2 ? CFG_ ## kind ## 2 \
: -1 /* or you can assert() here*/ )
用法如下:
GET(FILT, 0);
GET(DELTA, 2);
当然这种方法有一些缺点,至少它是idx
的多次评估,有些是生成的机器代码,但是在某些情况下它可能会有用。
如果索引是常数,那就更简单了
#define GET(kind, idx) CFG_ ## kind ## idx
此版本根本没有内存/代码开销。