如何修复MSVC++(Microsoft Visual studio)中"macro overloading"的可变参数宏相关问题?

How to fix variadic macro related issues with "macro overloading" in MSVC++ (Microsoft Visual studio)?

本文关键字:变参 参数 问题 overloading macro MSVC++ 何修复 Microsoft Visual studio      更新时间:2023-10-16

灵感来自这种解决方案,我在下面写了下面的代码,该代码模拟了"宏的过载"

#include<iostream>
#define CONCATE_(X,Y) X##Y
#define CONCATE(X,Y) CONCATE_(X,Y)
#define UNIQUE(NAME) CONCATE(NAME, __LINE__)
#define NUM_ARGS_(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, TOTAL, ...) TOTAL
#define NUM_ARGS(...) NUM_ARGS_(__VA_ARGS__, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
#define VA_MACRO(MACRO, ...) CONCATE(MACRO, NUM_ARGS(__VA_ARGS__))(__VA_ARGS__)
#define COUT(...) VA_MACRO(_COUT, __VA_ARGS__)
#define _COUT1(X) std::cout << "1 argumentn"
#define _COUT2(X, Y) std::cout << "2 argumentsn"
#define _COUT3(X, Y, Z) std::cout << "3 argumentsn"
int main ()
{
  COUT("A");
  COUT("A", 1);
  COUT("A", 1, 'a');
  return 0;
}

这在G /clang 编译器中正常工作,给出以下输出:

1 argument
2 arguments
3 arguments

但是,由于已知的编译器错误与__VA_ARGS__有关:

,它没有给出最新MSVC(2017(的预期输出。
1 argument
1 argument
1 argument

我尝试了以下帖子的各种"间接扩展"组合,但没有运气:
Visual Studio __VA_ARGS__问题

如何在MSVC中解决此问题?

除了知道它存在之外,我对MSVC错误不是很有经验,但是我能够在其他答案中应用解决方法:

#define MSVC_BUG(MACRO, ARGS) MACRO ARGS  // name to remind that bug fix is due to MSVC :-)
#define NUM_ARGS_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, TOTAL, ...) TOTAL
#define NUM_ARGS_1(...) MSVC_BUG(NUM_ARGS_2, (__VA_ARGS__))
#define NUM_ARGS(...) NUM_ARGS_1(__VA_ARGS__, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
#define VA_MACRO(MACRO, ...) MSVC_BUG(CONCATE, (MACRO, NUM_ARGS(__VA_ARGS__)))(__VA_ARGS__)

这还会在最新的GCC和Clang上产生适当的预处理器输出。得知有一种方法可以解决此问题,而无需致电MSVC_BUG宏两次"间接扩展",这并不感到惊讶。