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
我有一个接受通道号(0-31)的函数,我想找到相应的宏扩展(SPC_TMASK0_NONE、SPC_TMASK0_CH0...等)。
我认为动态创建宏扩展(作为字符串)将是最简单/最整洁/最干净的,但似乎我不能这样做,所以有人可以建议一个更好的选择来从通道号到宏扩展吗?
我知道可以直接使用对应于宏扩展的数字,但这有可能改变,所以我需要使用名称来确保随着时间的推移正确操作。
我真的不想要一个大的 if else / switch case - 我正在考虑一个包含名称的数组,通道号用于选择元素,但感觉也很笨重。
解决方案
如果您需要将运行时整数映射到宏的值,那么最好的选择确实是一个数组。但你不必自己写!
#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];
}
这将生成包含宏 0 到 31 的数组,并对其进行索引。我让你来处理输入限制和SPC_TMASK0_NONE
宏:)
推荐阅读
- node.js - FFMPEG m3u8 编码将 TS 文件的扩展名更改为其他内容
- javascript - 页面重新加载时未命中更改功能
- javascript - analyticsDataClient.runReport 在从 GA 查询时返回 null
- javascript - 二进制人类可读到实际大小
- javascript - 如何在 discord.js 上使机器人前缀不区分大小写?
- haskell - Haskell Lens:棱镜
- python - 如何在保留用户站点包的同时避免在 Python 的 sys.path 中有当前目录?
- ios - Swift - 如何确定我的应用程序消耗的数据量(蜂窝/WiFi)?
- symfony - Sass 加载器无法使用 Encore webpack 和 Symfony 5 加载 url
- java - Java-从命令行调用方法