5 ms·
This is similar to the C preprocessor trick STRINGIZE: #define STRINGIZE_DETAIL(x) #x #define STRINGIZE(x) STRINGIZE_DETAIL(x)
by CalChris 8y ago
This is similar to the C preprocessor trick STRINGIZE:
#define STRINGIZE_DETAIL(x) #x
#define STRINGIZE(x) STRINGIZE_DETAIL(x)
- gpderetta 8y agoIt probably uses stringification under the hood, but then relies on constexpr to "canonicalize" the name (removing everything before the dot, template parameters etc).
- Someone 8y agoFrom cursory reading, it seems it doesn’t, at all. It uses compiler-specific predefined values __PRETTY_FUNCTION__ (gcc, clang) or __FUNCSIG__ (MS Visual C++), and doesn’t work on other compilers. It also has to do work to extract the function name from the char arrays/C strings that those macros expand to. Reading answers to https://stackoverflow.com/questions/4384765/whats-the-difference-between-pretty-function-function-func/26907887 https://stackoverflow.com/questions/4384765/whats-the-differ..., it seems it would have been easier to use the __FUNCTION__ in gcc, but I’m not familiar with that (or the other predefined values) at all, so who knows?
- anon4242 8y agoActually, __FUNCTION__ won't work as it only expands to the name of the function, not any templates or arguments. It's actually a pretty clever way to automagically deduce not only names of variables but also of enums :). Too bad it's most likely not maintainable in the long run as compilers probably change what their __PRETTY_FUNCTION__ (or equivalent) macros expand to in new versions.
- neargye 8y agoI usually check the newest versions of compilers, and if the behavior changes, then I update the code
- asveikau 8y agoLast I knew __FUNCTION__ in GCC doesn't even do name de-mangling. You'd get the raw C symbol name with no C++ types.
- neargye 8y agohttps://stackoverflow.com/a/31163837/9514814 https://stackoverflow.com/a/31163837/9514814
- neargye 8y agoYou are absolutely right :)
- asveikau 8y agoThat was what I was thinking, then I saw that this will stringify enum values, eg. nameof(c) returns "RED", which the preprocessor #x will not do.