Does it matter?
Inline functions are preferred over macros in most C++ style guides, and should only be used where absolutely necessary.
In the case of safe_delete, an inline function is just as applicable, which means a macro isn't necessary.
template<class T> void safe_delete(T* x) { delete x; x = NULL; }
BTW, the if isn't necessary, as delete NULL; is valid (it does nothing) -- the if statement is often put there by programmers who learned on MSVC 6.0, which implemented "Microsoft C++", rather than C++98.
The main evilness about macros is that they don't obey C++ name scoping rules, so they can inadvertantly break other code.
e.g. say that I buy your code as a bit of middleware, and #include it into my own code that follows:
#include "cool_middleware.h"
namespace hodgman
{
template<class T> void safe_delete(T* x) { if(x) x->Release; }
void Frobnicate(Foo* foo)
{
foo->DoStuff();
safe_delete(foo);
}
}
This as soon as I #include your code in this file, my code breaks because of the macro! It becomes quite different:
void Frobnicate(Foo* foo)
{
foo->DoStuff();
if(foo) { delete foo; foo = NULL; }
}
If you'd used an inline function for safe_delete, then everything would be fine
Further reading:
http://www.parashift.com/c++-faq/inline-vs-macros.html
http://www.parashift.com/c++-faq/macros-with-if.html
http://www.parashift.com/c++-faq/macros-with-multi-stmts.html
http://www.parashift.com/c++-faq/macros-with-token-pasting.html