【问题标题】:Preprocessor macro that call another one : MSVC issue?调用另一个预处理器宏:MSVC 问题?
【发布时间】:2018-12-01 18:46:57
【问题描述】:

我想自己开发一种 for_each 宏。我从头开始构建它,因为我发现这个网站上的其他实现太复杂了,而且我在互联网上找不到任何资源来学习有关宏的技巧和技巧。

所以,我开始做的是制作一个打印值平方的宏。在我创建了一个宏MAP 之后调用MAP_ONE 调用f 与第一个arg。

在 clang 和 gcc 上,这段代码运行良好:

#include <iostream>

using namespace std;

#define PRINT_SQUARE(x) std::cout << x * x << std::endl;

#define MAP(f, ...) MAP_ONE(f, __VA_ARGS__)

#define MAP_ONE(f, x, ...) f(x)

int main() {
  MAP(PRINT_SQUARE, 5, 8);
  return 0;
}

在 MSVC 上它不起作用。错误是:

..\main.cpp(12): error C2563: mismatch in formal parameter list
..\main.cpp(12): error C2568: '<<': unable to resolve function overload
..\main.cpp(12): note: could be 'std::basic_ostream<_Elem,_Traits> &std::endl(std::basic_ostream<_Elem,_Traits> &)'

这是一个 MSVC 错误还是正常的,我只是做了一些被禁止的事情?

感谢Afshin的回答,我将之前的代码修改为:

#include <iostream>

using namespace std;

#define PRINT_SQUARE(x) std::cout << ((x) * (x)) << std::endl;

#define MAP(f, ...) MAP_ONE(f, __VA_ARGS__)

#define MAP_ONE(f, x, ...) f(x) f(__VA_ARGS__)

int main() {
  MAP(PRINT_SQUARE, 5, 8);
  return 0;
}

在 clang 和 GCC 上打印:25 和 64。在 MSVC 上它不编译:

D:\Desktop\Programmation\macro\main.cpp:12: error: C2059: syntax error: ')'

【问题讨论】:

  • MSVC 版本???
  • MSVC 版本 15.9.2
  • 如果你打电话给MAP_ONE 它可以正常工作。奇怪的是,调用MAP 不起作用。
  • 似乎对于MSVC x 不等于5 但等于5, 8,所以计算为8 * 8 = 64
  • @AntoineMorrier 解决了问题。检查回复。 :)

标签: c++ c++11 macros c-preprocessor


【解决方案1】:

更新:

这样就解决了问题:

#include <iostream>

using namespace std;

#define EXPAND(x) x

#define PRINT_SQUARE(x) std::cout << x * x << std::endl;

#define MAP_ONE(f, x, ...) f(x)

#define MAP(f, ...) EXPAND(MAP_ONE(f, __VA_ARGS__ ))

int main() {
  MAP(PRINT_SQUARE, 5, 8);
  return 0;
}

感谢this 链接。在VS中扩展__VA_ARGS__似乎有问题,这个技巧将解决问题。

【讨论】:

  • 它没有。它现在可以编译,但不是打印 25,而是打印 64...
  • @AntoineMorrier 是的,我也注意到了。
  • 是的,没错,我也有这个解决方案。看来MSVC太合规了啊哈哈
  • 需要使用/experimental:preprocessor才能使用msvc最新的预处理模块
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2015-04-17
  • 2010-11-23
  • 1970-01-01
相关资源
最近更新 更多