Macros are not functions.
Macros do TEXT replacement. So when you have
#define foo1( a ) (a * a)
any instance of foo1(
... )
with anything between then parenthesis will be expanded AS TEXT, not as an expression. So when you have foo1( 1 + 2 )
it turns into ( 1 + 2 * 1 + 2 )