Explanation : Macros do not have an address associated with them as they are processed by the pre-processor. They cannot be passed as arguments to a function, etc. Also, macros are replaced in a blind manner without any regard to the context which may result in a stupid code, like #define mul(a,b) a*b The macro call mul(a, b + 1) will be expanded as a *b+ 1, but our intention was to get a * (b+ 1 ) .