我想自己为每个宏开发一种。我从头开始构建它,因为我发现这个网站中的其他实现太复杂了,而且我在互联网上找不到任何资源来学习宏的技巧和技巧。
所以,我开始做的是制作一个宏来打印一个值的平方。在我创建宏之后
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> &)'
感谢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: ')'