Q:

Why should or shouldn't we prefer a macro that accepts arguments over a function that does the same job?

Following are two programs that give the area of the circle when the radius is passed as argument. But in the first program, macro.c, I am using a macro for the job, while in the second, function.c I am using a function for the job.
I am familiar with the use of functions,and the nuances it takes. But what about the case of macros that accept arguments? When should we prefer them over functions? And when should we avoid them? Which one gives better performance? I know the macro approach will lead to bulky code if the macro is used many times in the program, while for the case of the function, the same function is invoked many times for the job. But beyond this trivial difference, what are the other issues we need to look out for?
//macro.c

#include<stdio.h>
#define AREA(x) (3.14*x*x)

int main(void)
{
    float r1=6.25,r2=2.5,a;

    a=AREA(r1);
    printf("\nArea of circle=%f",a);
    a=AREA(r2);
    printf("\nArea of circle=%f",a);
}

//function.c

#include<stdio.h>
float area(float);

int main(void)
{
    float r1=6.25,r2=2.5;
    printf("\nArea of circle=%f",area(r1));
    printf("\nArea of circle=%f",area(r2));
}

float area(float radius)
{
    return 3.14*radius*radius;
}

A:

A number of flip sides of macro:     

With macro you lose all the type safety. The arguments being passed are not typed checked as in case of inline functions.
Since macros are pure textual replacement they may produce Side effects.
An macro might be evaluated more than once and result in errors.

So it is better to just avoid them, Use inline functions instead.      
inline functions do have their own share of flip sides:

They are not guaranteed to be inlined per see.

But given the comparison, inline definitely scores over macros.

A:

One reason to prefer functions, particularly external functions in library code, is so you can fix bugs without recompiling everything that uses them. For instance, fixing your bad definition of pi... :-)
The only time I can think to prefer macros is when you're doing generic programming, i.e. you want the same code to work on various different types, or where you want to use arguments to the macro in ways other than as expressions (for instance, having an operator as an input to the macro, or stringifying an argument, etc.).

