代码之家  ›  专栏  ›  技术社区  ›  iammilind

如何在MSVC++(Microsoft Visual studio)中解决变量宏相关的“宏重载”问题?[副本]

  •  0
  • iammilind  · 技术社区  · 8 年前

    灵感来自 this kind of solution ,我编写了以下代码,它模拟 “宏重载” .

    #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 argument\n"
    #define _COUT2(X, Y) std::cout << "2 arguments\n"
    #define _COUT3(X, Y, Z) std::cout << "3 arguments\n"
    
    int main ()
    {
      COUT("A");
      COUT("A", 1);
      COUT("A", 1, 'a');
      return 0;
    }
    

    这在g++/clang++编译器中运行良好,提供以下输出:

    1 argument
    2 arguments
    3 arguments
    

    然而,由于已知的编译器错误,它没有给出最新MSVC(2017)的预期输出 __VA_ARGS__ :

    1 argument
    1 argument
    1 argument
    

    根据下面的帖子,我尝试了各种“间接扩展”组合,但没有成功:
    Visual studio __VA_ARGS__ issue

    如何在MSVC中解决此问题?

    1 回复  |  直到 8 年前
        1
  •  1
  •   iammilind    8 年前

    我对MSVC bug不是很有经验,只是知道它存在,但我能够在另一个答案中应用解决方法 as follows :

    #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 “间接扩展”宏两次,但我没有找到它。

    推荐文章