将模板参数传递到MSVC中的宏 我试图编译最初在Linux上开发的Visual Studio 2017中的C++代码。项目原样在Linux上编译,但不在VS中编译。错误来自尝试使用宏来比较模板参数
电话: 其中'filter.xhat'和'mat'都是向量 定义:将模板参数传递到MSVC中的宏 我试图编译最初在Linux上开发的Visual Studio 2017中的C++代码。项目原样在Linux上编译,但不在VS中编译。错误来自尝试使用宏来比较模板参数,c++,visual-studio,macros,visual-studio-2017,variadic-macros,C++,Visual Studio,Macros,Visual Studio 2017,Variadic Macros,电话: 其中'filter.xhat'和'mat'都是向量 定义: #define EXPECT_MATRIX_EQUAL(...) \ NAVUTILS_TEST_MATRIX_EQUAL_(GTEST_NONFATAL_FAILURE_, __VA_ARGS__) #define NAVUTILS_TEST_MATRIX_EQUAL_(fail, expected, actual, ...) \ NAVUTILS_TEST_EQUAL_(expected, \
#define EXPECT_MATRIX_EQUAL(...) \
NAVUTILS_TEST_MATRIX_EQUAL_(GTEST_NONFATAL_FAILURE_, __VA_ARGS__)
#define NAVUTILS_TEST_MATRIX_EQUAL_(fail, expected, actual, ...) \
NAVUTILS_TEST_EQUAL_(expected, \
actual, \
__matrices_equal(expected, actual, ##__VA_ARGS__), \
fail)
#define NAVUTILS_TEST_EQUAL_(expected, actual, testExpr, fail) \
GTEST_TEST_BOOLEAN_(testExpr, #testExpr, actual, expected, fail) \
<< "Value of " #expected " [" << (expected).rows() << " x " << (expected).cols() << "]:\n" \
<< (expected) \
<< "\n\nValue of " #actual " [" << (actual).rows() << " x " << (actual).cols() << "]:\n" \
<< (actual) \
<< "\n\n"
定义期望矩阵等于(…)\
NAVUTILS_测试_矩阵_相等_(GTEST_非致命性_故障_uu,VA_参数_u)
#定义NAVUTILS_测试_矩阵_相等(失败、预期、实际等)\
NAVUTILS_测试_相等(预期\
实际的\
__矩阵等于(预期、实际、变量)\
失败)
#定义NAVUTILS\u TEST\u EQUAL(预期、实际、testExpr、失败)\
GTEST_TEST_BOOLEAN_(testExpr,#testExpr,实际,预期,失败)\
这里的主要问题是MSVC在宏扩展内的宏调用中处理
\uu VA\u ARGS\uu
的方式。请参阅和答案,其中包括Microsoft关于标准解释的声明。正如对该问题的公认答案所建议的那样,解决方案是额外的间接层次:
#define EXPAND_(X) X
#define EXPECT_MATRIX_EQUAL(...) \
EXPAND_(NAVUTILS_TEST_MATRIX_EQUAL_(GTEST_NONFATAL_FAILURE_, __VA_ARGS__))
还有一个问题:
__matrices_equal(expected, actual, ##__VA_ARGS__), \
如果\uu VA\u ARGS\uu
为空,则使用##
以避免包含上述内容是一个GCC扩展,不应在可移植代码中使用。然而,它显然在MSVC中起作用
#define EXPAND_(X) X
#define EXPECT_MATRIX_EQUAL(...) \
EXPAND_(NAVUTILS_TEST_MATRIX_EQUAL_(GTEST_NONFATAL_FAILURE_, __VA_ARGS__))
__matrices_equal(expected, actual, ##__VA_ARGS__), \