Здравствуйте,
только что обнаружил возможность выбирать что вызвать: макрос или функцию:
#include <cstdio>
void foo()
{
printf("function\n");
}
#define foo() printf("macro\n");
int main()
{
foo(); // print "macro"
(foo)(); // print "function"
return 0;
}
также можно обойти знаменитую проблему с макросами min max в windows.h
#include <windows.h> // for macros min/max
#include <algorithm> // for std::min, std::max
int main()
{
// int n = std::max(2, 3); // если раскомментировать то будет ошибка
int n = (std::max)(2, 3); // всё нормально
}
приятный момент во всём этом, то что такое поведение соответствует стандарту(16.3/9)
То есть подстановка function-like макроса происходит только если токен следующий непосредственно после имени макроса есть открывающая скобка.
Ну в общем мелочь, а приятно.
ЗЫ
Надеюсь не баян.