Ich möchte ein C-Präprozessormakro mit Parameter N definieren, das eine Deklaration für ein benutzerdefiniertes C++-Literal mit dem Suffix _uN erstellt.
Code: Select all
#define DEFINE_LITERAL(N) int operator""_u##N(const char* s);
DEFINE_LITERAL(128)
Der obige Versuch ist kein streng gültiges C11-Präprozessormakro. Bei Verwendung des MSVC-Compilers mit dem Flag /Zc:preprocessor heißt es:
Code: Select all
warning C5103: pasting '""_u' and '128' does not result in a valid preprocessing token
Die Problemumgehung für den MSVC-Compiler besteht darin, die Token durch Leerzeichen zu trennen: Operator"" _u##N. Dies ist jedoch aufgrund des CWG 2521 nicht mit C++23 kompatibel. Der Clang-Compiler warnt standardmäßig davor:
Code: Select all
warning: identifier '_u128' preceded by whitespace in a literal operator declaration is deprecated [-Wdeprecated-literal-operator]