The C preprocessor is justifiably feared and shunned by the C++ community. In-lined functions, consts and templates are usually a safer and superior alternative to a #define.
The following macro:
#define SUCCEEDED(hr) ((HRESULT)(hr) >= 0)
is in no way superior to the type safe:
inline bool succeeded(int hr) { return hr >= 0; }
But macros do have their place, please list the uses you find for macros that you can’t do without the preprocessor.
Please put each use-cases in a seperate answer so it can be voted up and if you know of how to achieve one of the answers without the preprosessor point out how in that answer’s comments.
As wrappers for debug functions, to automatically pass things like
__FILE__,__LINE__, etc:Since C++20 the magic type
std::source_locationcan however be used instead of__LINE__and__FILE__to implement an analogue as a normal function (template).