如何在预处理器定义中存储数组的索引?

How to store indicies of an array in preprocessor defines?

我正在用 cpp 创建一个 VST(虚拟仪器)程序,我有一个结构数组,代表我程序中的各种参数:

const FloatParam_Properties FloatParamProps[NUM_FLOAT_PARAMS] =
{
    //Frequency
    {"BaseFreq",    "Base Freq",    0.0,    20.0,   5.0,    0.6},   //0 
    {"FreqDelta",   "Freq Delta",   -20.0,  20.0,   0.0,    0.6},   //1
    ...

    //Wave
    {"OscSelect",   "Wave form",    0.0,    3.0,    0.0,    1.0},   //9

    //Master
    {"Volume",      "Volume",       0.0,    1.0,    0.1,    0.4},   //10
};

这个数组中的每个元素都是一个结构,当我想访问这些结构时,我只是对索引进行了硬编码(例如,执行 FloatParamProps[0] 来访问基频)。但是,我想使用 cpp 预处理器为这些硬编码索引命名,因为这里的所有内容在编译时都是已知的,如果我不必对这些定义进行硬编码就好了。

我想做的是:

const FloatParam_Properties FloatParamProps[NUM_FLOAT_PARAMS] =
{
    //Frequency
    DEF_FLOAT_PARAM(BaseFreq,    "Base Freq",    0.0,    20.0,   5.0,    0.6),   //0 
    DEF_FLOAT_PARAM(FreqDelta,   "Freq Delta",   -20.0,  20.0,   0.0,    0.6),   //1
    ...

    //Wave
    DEF_FLOAT_PARAM(OscSelect,   "Wave form",    0.0,    3.0,    0.0,    1.0),   //9

    //Master
    DEF_FLOAT_PARAM(Volume,      "Volume",       0.0,    1.0,    0.1,    0.4),   //10
};

其中 DEF_FLOAT_PARAM 是一个宏,然后使用 __COUNTER__ 宏将第一个参数转换为预处理器定义(或者可能是 constexpr)。然后,如果我想访问第一个,我可以做 FloatParamProps[BaseFreq],例如。我遇到的问题是您不能在宏中定义,所以我不能将 BaseFreq 定义为常量。

我也试过

#define DEF_FLOAT_PARAM(ID, Name, minVal, maxVal, defaultVal, skewFactor) P_##ID __COUNTER__ \
            {#ID, Name, minVal, maxVal, defaultVal, skewFactor}, 

这里的计划是尝试在宏之外进行定义,然后像这样手动输入:

const FloatParam_Properties FloatParamProps[NUM_FLOAT_PARAMS] =
{
    //Frequency
    #define DEF_FLOAT_PARAM(BaseFreq,    "Base Freq",    0.0,    20.0,   5.0,    0.6),   //0
    ... 

但问题是预处理器不想在定义的前面扩展该宏。要是我能告诉它展开宏就好了。

有人知道我该怎么做吗?

谢谢。

使用x-macros:

#define PARAMS(X) \
    X(BaseFreq,    "Base Freq",    0.0,    20.0,   5.0,    0.6) \
    X(FreqDelta,   "Freq Delta",   -20.0,  20.0,   0.0,    0.6) \
    X(OscSelect,   "Wave form",    0.0,    3.0,    0.0,    1.0)

const FloatParam_Properties FloatParamProps[NUM_FLOAT_PARAMS] =
{
    #define PARAM_STRUCT(id, ...) {#id, __VA_ARGS__},
    PARAMS(PARAM_STRUCT)
    #undef PARAM_STRUCT
};

enum Params
{
    #define PARAM_ENUM(id, ...) id,
    PARAMS(PARAM_ENUM)
    #define PARAM_ENUM
    _count,
};

这将生成您已有的相同数组,以及一个包含与数组索引匹配的常量的枚举。