分组#defines的最佳方式

时间:2016-07-06 09:07:55

标签: c++ c

我有一堆#define,由Visual Studio生成,其值无法控制。它们以3个为一组配对,例如

CFG_FILT0
CFG_FILT1
CFG_FILT2
CFG_DELTA0
CFG_DELTA1
CFG_DELTA2
...

在我正在使用的当前课程中,我希望有一个本地(privateconst)结构,它封装了所有这些#define。然后,这个类的一些函数需要读取这些值,但只能在前面提到的3个组中读取。潜在结构(myStruct)应该允许这样的东西:

for (int idx = 0; chIdx < 3; idx++)
{
    GetItem(myStruct[idx].filt)
    GetItem(myStruct[idx].delta)
    ...
}

在可读性和内存使用方面,定义此类结构的最佳方法是什么?

请注意,我宁愿只有一个结构,而不是每个3 #define组的一个结构(例如myStructFiltmyStructDelta,如上例所示)

1 个答案:

答案 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

此版本根本没有内存/代码开销。