Firstly a macro is a macro and a function is a function. There is no such thing as a "macro function". You might however refer to a "function-like macro" to distinguish a simple constant identifier from a macro that takes parameters.
Use of function-like macros is usually ill-advised and most are badly defined. For example your example should at least be defined thus:
#define BIGGER(x,y) ((x)>(y)?(x):(y))
because the parameters x and y themselves may be expressions involving other operators and without the parentheses, the order of evaluation might be unexpected.
Another problem with this macro is that both x and y are evaluated twice, which for simple variables or literal constants may not be a problem, but for complex expressions is wasteful, and for expressions with side effects could produce very strange results.
There are two reasons usually cited for using a macro
- Performance (avoiding a function call overhead).
- Generic functions that work for any parameter type.
The first aim is often defeated for the reasons mentioned above, and in any case any decent compiler will automatically in-line suitably short functions.
The second is a good way of shooting yourself in the foot - type agreement and checking cannot be enforced and it is a good thing not something to be defeated.
Another reason to avoid macros is that they are invisible to the symbolic debugger. You cannot step-into a macro as you can a function and you cannot observe its variable state or place break-points within it. A simple macro such as this may be acceptable, but it really does not gain you much while causing potential problems.
In C++ most of the uses for macros (function-like and simple) in C are replaced by more flexible and powerful language mechanisms such as function overloading, in-lining, different const semantics, template functions and polymorphism. While you should be wary of writing a macro in C, you should hear alarm bells in C++. This is by the is an argument for using C++ rather than avoiding it.
But you may say "I'm not using C++" but you are. You have declared main() to return an int, but have not explicitly returned a value. That is only valid in C++ (and then only in main), a C compiler should reject that.