c++ - 调用另一个预处理器宏:MSVC 问题?
问题描述
我想自己开发一种 for_each 宏。我从头开始构建它,因为我发现这个网站上的其他实现太复杂了,而且我在互联网上找不到任何资源来学习有关宏的技巧和技巧。
所以,我开始做的是制作一个打印值平方的宏。在我创建了一个使用第一个参数MAP
调用MAP_ONE
的宏之后。f
在 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: ')'
解决方案
更新:
这解决了问题:
#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;
}
感谢这个链接。在 VS中扩展似乎存在问题,__VA_ARGS__
这个技巧将解决问题。
推荐阅读
- vb.net - Visual Basic 简单的随机播放例程
- python - 如何创建将二叉树转换为元组的函数?
- python - BeautifulSoup:如何忽略嵌套元素
- javascript - 在命令行上执行 JavaScript
- angular - 在 Angular 中动态创建控件时不呈现 formControlName
- flutter - Flutter:在身份验证错误时未显示 SnackBar
- docker - 如何在 Windows 代理 - 无效绑定挂载规范上运行 jenkins docker 映像?
- javascript - 如何进行空 cookie 检查
- typescript - 如何从传递的对象数组中推断从属性中选取的值的总和类型
- java - Docker 应用程序无法连接到数据库