代码之家  ›  专栏  ›  技术社区  ›  Antoine Morrier

调用另一个宏的预处理器:MSVC问题?

  •  2
  • Antoine Morrier  · 技术社区  · 6 年前

    我想自己为每个宏开发一种。我从头开始构建它,因为我发现这个网站中的其他实现太复杂了,而且我在互联网上找不到任何资源来学习宏的技巧和技巧。

    所以,我开始做的是制作一个宏来打印一个值的平方。在我创建宏之后 MAP MAP_ONE 那叫 f 使用第一个arg。

    在clang和gcc上,此代码运行良好:

    #include <iostream>
    
    using namespace std;
    
    #define PRINT_SQUARE(x) std::cout << x * x << std::endl;
    
    #define MAP(f, ...) MAP_ONE(f, __VA_ARGS__)
    
    #define MAP_ONE(f, x, ...) f(x)
    
    int main() {
      MAP(PRINT_SQUARE, 5, 8);
      return 0;
    }
    

    在MSVC上它不起作用。错误是:

    ..\main.cpp(12): error C2563: mismatch in formal parameter list
    ..\main.cpp(12): error C2568: '<<': unable to resolve function overload
    ..\main.cpp(12): note: could be 'std::basic_ostream<_Elem,_Traits> &std::endl(std::basic_ostream<_Elem,_Traits> &)'
    

    感谢Afshin的回答,我将之前的代码修改为:

    #include <iostream>
    
    using namespace std;
    
    #define PRINT_SQUARE(x) std::cout << ((x) * (x)) << std::endl;
    
    #define MAP(f, ...) MAP_ONE(f, __VA_ARGS__)
    
    #define MAP_ONE(f, x, ...) f(x) f(__VA_ARGS__)
    
    int main() {
      MAP(PRINT_SQUARE, 5, 8);
      return 0;
    }
    

    在clang和GCC上打印:25和64。在MSVC上不编译:

    D:\Desktop\Programmation\macro\main.cpp:12: error: C2059: syntax error: ')'
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Afshin    6 年前

    更新:

    这就解决了问题:

    #include <iostream>
    
    using namespace std;
    
    #define EXPAND(x) x
    
    #define PRINT_SQUARE(x) std::cout << x * x << std::endl;
    
    #define MAP_ONE(f, x, ...) f(x)
    
    #define MAP(f, ...) EXPAND(MAP_ONE(f, __VA_ARGS__ ))
    
    int main() {
      MAP(PRINT_SQUARE, 5, 8);
      return 0;
    }
    

    this 链接扩张似乎有问题 __VA_ARGS__