 
                            ...
This solution eliminates the problem of recalling which macros are safe and which are not. Unlike the ABS() macro which operates on operands of any type, the abs() function only accepts arguments of type int. C11 provides a way to overload expressions with arguments of different types, but C99 provides no such mechanism. Consequently, there is no way to achieve such genericity using the facilities of the standard C99 language. However, some C implementations provide extensions that make it possible to solve the original problem without using functions. For example, 
Compliant Solution (GCC)
GCC's Statement Expressions along with the __typeof extension make it possible to declare and assign the value of the macro operand to a temporary of the same type and perform the computation on the temporary, thus guaranteeing that the operand will be evaluated exactly once. 
...