替代动态创建变量名称

Tim*_*ram 2 c++

我有一个头文件(不是由我编写的,我无法更改),其中包含以下格式的定义:

#define     SPC_TMASK0_NONE         0x00000000
#define     SPC_TMASK0_CH0          0x00000001
#define     SPC_TMASK0_CH1          0x00000002
#define     SPC_TMASK0_CH2          0x00000004
#define     SPC_TMASK0_CH3          0x00000008
#define     SPC_TMASK0_CH4          0x00000010
#define     SPC_TMASK0_CH5          0x00000020
#define     SPC_TMASK0_CH6          0x00000040
#define     SPC_TMASK0_CH7          0x00000080
#define     SPC_TMASK0_CH8          0x00000100
#define     SPC_TMASK0_CH9          0x00000200
#define     SPC_TMASK0_CH10         0x00000400
#define     SPC_TMASK0_CH11         0x00000800
#define     SPC_TMASK0_CH12         0x00001000
#define     SPC_TMASK0_CH13         0x00002000
#define     SPC_TMASK0_CH14         0x00004000
#define     SPC_TMASK0_CH15         0x00008000
#define     SPC_TMASK0_CH16         0x00010000
#define     SPC_TMASK0_CH17         0x00020000
#define     SPC_TMASK0_CH18         0x00040000
#define     SPC_TMASK0_CH19         0x00080000
#define     SPC_TMASK0_CH20         0x00100000
#define     SPC_TMASK0_CH21         0x00200000
#define     SPC_TMASK0_CH22         0x00400000
#define     SPC_TMASK0_CH23         0x00800000
#define     SPC_TMASK0_CH24         0x01000000
#define     SPC_TMASK0_CH25         0x02000000
#define     SPC_TMASK0_CH26         0x04000000
#define     SPC_TMASK0_CH27         0x08000000
#define     SPC_TMASK0_CH28         0x10000000
#define     SPC_TMASK0_CH29         0x20000000
#define     SPC_TMASK0_CH30         0x40000000
#define     SPC_TMASK0_CH31         0x80000000
Run Code Online (Sandbox Code Playgroud)

我有一个函数接受一个通道号(0-31),我想找到相应的宏扩展(SPC_TMASK0_NONE,SPC_TMASK0_CH0 ......等).

我认为动态创建宏扩展(作为一个字符串)将是最简单/最新/最干净的但似乎我不能这样做,所以有人可以提出一个更好的替代方案,从频道号到宏扩展吗?

我知道,对应于宏扩展的数量可以直接使用,但这一现状必须改变,所以我需要使用的名称,以确保在时间正确操作的可能性.

我真的不想要一个大的if else/switch案例 - 我正在考虑一个名字输入的数组,并且使用频道号来选择元素,但这也感觉很笨拙.

Que*_*tin 5

如果需要将运行时整数映射到宏的值,那么最好的选择确实是数组.但你不必自己写!

#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/cat.hpp>

constexpr auto channelMask(int channelNumber) {
    constexpr std::uint32_t array[] {
#define detail_channelMask_case(z, n, data) \
    BOOST_PP_CAT(SPC_TMASK0_CH, n),

    BOOST_PP_REPEAT(32, detail_channelMask_case, ~)

#undef detail_channelMask_case
    };

    return array[channelNumber];
}
Run Code Online (Sandbox Code Playgroud)

这将生成具有宏0到31的数组,并为其编制索引.我留给你处理输入限制和SPC_TMASK0_NONE宏:)