【问题标题】:Variadic Macro working evaluating correctly with clang but not the windows compiler可变参数宏可以使用 clang 正确评估,但不能使用 windows 编译器
【发布时间】:2021-11-26 22:11:42
【问题描述】:

所以我有这个宏,它接受不同数量的参数并根据参数的数量调用另一个宏

#define VA_NARGS_IMPL(_1, _2, _3, _4, N, ...) BENCHMARK##N
#define VA_NARGS(...)  VA_NARGS_IMPL(__VA_ARGS__, 4, 3, 2, 1)

#define BENCHMARK(...) VA_NARGS(__VA_ARGS__)( __VA_ARGS__ )

所以BENCHMARK( T, 1) 变成BENCHMARK2(T, 1) 这是...

#define BENCHMARK2( test, description ) \
  BENCHMARK_INTERNAL( test, 0, 0, description ) // NOLINT

变成(只提供一个sn-p)...

#define BENCHMARK_INTERNAL(test, lb, ub, d)                                   \
  struct test : public Test {                                                 \
    public:    ...                                                            \

如我所料,Clang 正在评估 MACROS,这是来自该扩展的 sn-p ...

struct T : public Test { public: ...

但是当 Windows 预处理这个文件时,我得到...

struct T, 1 : public Test { public: ...

但是,如果我直接调用 BENCHMARK2 ...BENCHMARK2( T, 1),一切都会按我的预期进行。

Windows 处理可变参数宏的方式不同吗?是否有适合我的场景的跨平台解决方案?

我正在使用 MSVC 的 x64 编译器(版本 14.28.29333)

【问题讨论】:

  • 您的问题描述有问题 - 我没有看到 VA_NARGS 定义,也没有看到 BENCHMARK2 调用。
  • VA_NARGS(__VA_ARGS__) 成为 BENCHMARK2。我为上下文添加了 VA_NARGS
  • Windows 编译器是哪个编译器?我目前正在使用在 Windows 上运行的 3 个编译器。
  • @ThomasMatthews 我正在使用的编译器的完整路径是 C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29333\bin\Hostx64\x64\cl.exe 如果在二进制/版本/架构之外有任何内容,我可以提供提供上下文,请告诉我。
  • 使用 MSVC,VA_NARGS(T, 1) 变为 BENCHMARK1,而不是 BENCHMARK2demo

标签: c++ visual-c++ c++17


【解决方案1】:

感谢@Igor Tandetnik我找到了解决方案。

我的问题与这篇文章类似 - MSVC doesn't expand __VA_ARGS__ correctly

问题是VA_NARGS 在 Windows 上没有正确展开。我通过添加这个编译标志 /Zc:preprocessor 来修复它。

【讨论】:

    猜你喜欢
    • 2014-12-04
    • 2013-12-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多