将模板参数传递到MSVC中的宏 我试图编译最初在Linux上开发的Visual Studio 2017中的C++代码。项目原样在Linux上编译,但不在VS中编译。错误来自尝试使用宏来比较模板参数

将模板参数传递到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, \

电话:

其中'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, \
                   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__), \