我正在尝试修复一个在GCC上运行良好的MSVC预处理程序错误。
以下是简化的测试用例。
#define TF_STATUS_MACROS_CONCAT_NAME(x, y) TF_STATUS_MACROS_CONCAT_IMPL(x, y)
#define TF_STATUS_MACROS_CONCAT_IMPL(x, y) x##y
#define TF_ASSIGN_OR_RETURN(...) \
TF_STATUS_MACRO_GET_VARIADIC_IMPL(__VA_ARGS__, TF_ASSIGN_OR_RETURN_IMPL_3, \
TF_ASSIGN_OR_RETURN_IMPL_2) \
(__VA_ARGS__)
#define TF_STATUS_MACRO_GET_VARIADIC_IMPL(_1, _2, _3, NAME, ...) NAME
#define TF_ASSIGN_OR_RETURN_IMPL_2(lhs, rexpr) \
TF_ASSIGN_OR_RETURN_IMPL_3(lhs, rexpr)
#define TF_ASSIGN_OR_RETURN_IMPL_3(lhs, rexpr) \
TF_ASSIGN_OR_RETURN_IMPL( \
TF_STATUS_MACROS_CONCAT_NAME(_status_or_value, __COUNTER__), lhs, rexpr)
#define TF_ASSIGN_OR_RETURN_IMPL(statusor, lhs, rexpr) \
auto statusor = (rexpr); \
if (!statusor) { \
return 0; \
} \
lhs = std::move(statusor)
int foo(int x) { return x * 2; }
int main() {
int a;
TF_ASSIGN_OR_RETURN(a, foo(10));
}
对于GCC,预处理输出为:
int foo(int x) { return x * 2; }
int main() {
int a;
auto _status_or_value0 = (foo(10)); if (!_status_or_value0) { return 0; } a = std::move(_status_or_value0);
}
然而,MSVC给了我这个:
int foo(int x) { return x * 2; }
int main() {
int a;
test.cpp(32): warning C4003: not enough actual parameters for macro 'TF_STATUS_MACRO_GET_VARIADIC_IMPL'
(a, foo(10));
}
知道如何解决这个问题吗?