MSVC预处理器错误

时间:2017-12-11 12:05:16

标签: c++ visual-c++

我正在尝试修复一个在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));
}

知道如何解决这个问题吗?

0 个答案:

没有答案