【发布时间】: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,而不是BENCHMARK2:demo。
标签: c++ visual-c++ c++17