将模板参数传递到 MSVC 中的宏中
Passing template parameters into macros in MSVC
我正在尝试在Visual Studio 2017中编译最初在Linux上开发的C++代码。 该项目在Linux上编译,但不在VS上编译。 错误来自尝试使用宏来比较模板参数。
叫:
EXPECT_MATRIX_EQUAL(filter.xhat, mat);
其中"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)
<< "nnValue of " #actual " [" << (actual).rows() << " x " << (actual).cols() << "]:n"
<< (actual)
<< "nn"
错误:
C:UsersANTadminDesktopscorpion-cpptestincludeLinearFilterTests.h(19): warning C4003: not enough actual parameters for macro 'NAVUTILS_TEST_MATRIX_EQUAL_'
C:UsersANTadminDesktopscorpion-cpptestincludeLinearFilterTests.h(19): error C2059: syntax error: ')'
C:UsersANTadminDesktopscorpion-cpptestincludeLinearFilterTests.h(19): error C2181: illegal else without matching if
C:UsersANTadminDesktopscorpion-cpptestincludeLinearFilterTests.h(19): error C2065: 'gtest_ar_': undeclared identifier
C:UsersANTadminDesktopscorpion-cpptestincludeLinearFilterTests.h(19): error C2228: left of '.c_str' must have class/struct/union
C:UsersANTadminDesktopscorpion-cpptestincludeLinearFilterTests.h(19): error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'testing::internal::AssertHelper'
C:UsersANTadminDesktopscorpion-cpptestincludeLinearFilterTests.h(19): note: No constructor could take the source type, or constructor overload resolution was ambiguous
我假设 MSVC 在使用宏方面必须有一些特别的东西,这是我缺少的。 根据我的研究,应该正确处理重载的宏,所以我不明白为什么我会收到这些错误。
这里的主要问题是 MSVC 在宏扩展中的宏调用中处理__VA_ARGS__
的方式。请参阅此问题和答案,其中包括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__),
使用##
避免包含前面的 ,如果__VA_ARGS__
为空,则为 GCC 扩展,不应在可移植代码中使用。但是,显然它在 MSVC 中有效。
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用指向成员的指针将成员函数作为参数传递
- 如何将参数传递给正在使用模板的类
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将部分流作为参数传递
- 我正在开发服务器,ip作为参数传递不起作用
- 将成员函数指针作为参数传递给模板方法
- 如何在C++中将迭代器作为函数参数传递
- 将附加参数传递给使用 beast::bind_front_handler 调用的函数
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- 将参数传递为"const"的奇怪效果
- 如何在 c++ 中将函数作为参数传递?
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- 使用引用与指针将数组作为参数传递
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 为什么我不能将引用作为 std::async 的函数参数传递
- 将模板参数传递到 MSVC 中的宏中
- 将std::vector作为模板模板参数传递时出错-在GCC中有效,在MSVC中失败