Потому, что
1. нет контроля типов
2. нет ограничения по области видимости, типа неймспейсов.
3. макрос разворачивается подстановкой в месте использования, т.е. там будет вставлен код
((a) > (b) ? (a) : (b)) который превратится в ((++a) > (b+10) ? (++a) : (b+10))
4. макросы сложно отлаживать
5. неправильно написанный макрос будет компилироваться в непонятно что. Например если убрать те же скобки
как без них раскроется выражение x = max(a, b) + 10; ?
x = a > b ? a : b+10;
для max скорее всего параметры не имеет смысла оборачивать в скобки, достаточно общих, хотя наверное можно что-то придумать чтобы сломалось без них. Просто так принято, из за того что макросы могут оказаться внутри выражения и как там раскроются их нетривиальные параметры не понятно.
например
#include <iostream>
#define mymax(a,b) a>b?a:b
#define mul(a,b) a*b
int main()
{
std::cout << mymax(5, 10) << std::endl; // Ошибка компиляции
std::cout << mul(5+5, 10) << std::endl; // Неожиданно на выходе 55, а не 100
return 0;
}