Макрос препроцессора, который вызывает другой: проблема MSVC? - PullRequest
0 голосов
/ 01 декабря 2018

Я хочу самостоятельно разработать своего рода макрос 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: ')'

1 Ответ

0 голосов
/ 01 декабря 2018

ОБНОВЛЕНИЕ:

Это решает проблему:

#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;
}

Благодаря этой ссылке.Кажется, есть проблема с расширением __VA_ARGS__ в VS, и этот трюк решит проблему.

...