Я хочу самостоятельно разработать своего рода макрос 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 или это нормально, и я просто что-то запретил?
Благодаря ответу Афшина я изменил предыдущий код так:
#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: ')'