c++ - MSVC 预处理器错误 - 在参数计数上重载 C/C++ 宏
问题描述
我正在尝试编写一个重载的宏来格式化StringMap
条目,并且当有多个参数时无法让预处理器识别。我已经查看了几乎所有类似的问题,并尝试了 5 种以上的实现,但都没有奏效。比如这个问题。
我的实现与接受的答案相同,如下所示:
#define STRING_MAP_ENTRY_1(a) \
{ a, #a }
#define STRING_MAP_ENTRY_2(a, b) \
{ a, b }
#define STRING_MAP_ENTRY( ... ) VA_SELECT( STRING_MAP_ENTRY, __VA_ARGS__ )
#define CAT( A, B ) A ## B
#define SELECT( NAME, NUM ) CAT( NAME ## _, NUM )
#define GET_COUNT( _1, _2, _3, _4, _5, _6, COUNT, ... ) COUNT
#define VA_SIZE( ... ) GET_COUNT( __VA_ARGS__, 6, 5, 4, 3, 2, 1 )
#define VA_SELECT( NAME, ... ) SELECT( NAME, VA_SIZE(__VA_ARGS__) )(__VA_ARGS__)
这适用于单个参数调用,enum strings
如下所示,但manual_strings
我收到警告warning C4002: too many arguments for function-like macro invocation 'STRING_MAP_ENTRY_1'
。这告诉我它不能正常工作,因为它没有调用_2
版本。
static StringMap<uint8> const enum_strings = {
STRING_MAP_ENTRY(ENUM_VALUE_1),
STRING_MAP_ENTRY(ENUM_VALUE_2)};
static StringMap<uint8> const manual_strings = {
STRING_MAP_ENTRY(0, "ENTRY_0"),
STRING_MAP_ENTRY(1, "ENTRY_1")};
尝试我在类似问题中看到的所有其他实现时,我都会收到同样的警告。知道为什么它不起作用吗?我在这里和那里看到了很多关于编译器版本的注释。这可能是原因吗?该项目是使用 VS 2017 中的默认 MSVC 编译器编译的。我包含了 C 标签,因为尽管这是在 C++ 中,但宏定义都是有效的 C。
解决方案
推荐阅读
- r - R中未计算的内存使用情况
- javascript - 如何在javascript中更改全局变量的值
- flutter - Flutter 没有为“User”类型定义“then”方法
- javascript - 我如何使用带有 JS 的 html 选择标签
- javascript - 下拉列表以显示表格 Flask/python
- python - OpenPyxl将python df保存到带有多张工作表的excel文件中,但是当我打开文件时,它会在第一张工作表上打开
- python - 为什么 pandas dataframe.index 中没有重复项?
- javascript - 如果使用高阶函数的嵌套对象数组中不存在值,如何返回数据
- android-studio - 如何在kotlin中将变量从一个片段传递到另一个片段
- laravel - 带有 Laravel 的 Inertia 中的 Vue 组件似乎加载了两次