1. The macro consume the pre-process time and function consume compile time. The macro will not immediate invoke function call.
2. The macro does not have return value, it will only substitute statement.
3. The parameter in macro does not have a specific type. The parameter in function does.
4. The argument , when represented as a expression, will be calculated first then pass to the function. The argument will not, it will substitute directly.
5. The macro may have some unexpected side-effect.
Nowadays, people prefer inline function(compile) to macro(pre-process).