I don't remember where, but I have read that the reason is for __func__ == __func__ expression to be true. Including assigning it to multiple char* variables, and passing down to other functions and only comparing then. If __func__ is an array variable, then it will true. But if it is preprocessor #define, then it's up to compiler optimizer to figure out that it can be same char array (because contents are equal). MSVC, for example, doesn't do this by default. It does only if you specify /GF is enabled (it is part of /O2). See what happens when GF is disabled: https://godbolt.org/g/0W5fof
Compiler will compare two different pointers which will evaluate to 0 (false). Remove "-GF-" and compiler will see that pointers are equal at compile time and will evaluate to 1 (true).