如何在预处理器定义中存储数组的索引?
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,
};
这将生成您已有的相同数组,以及一个包含与数组索引匹配的常量的枚举。
我正在用 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,
};
这将生成您已有的相同数组,以及一个包含与数组索引匹配的常量的枚举。