In C, the preprocessor operator that converts a macro parameter to a string literal is #.
This is called the stringizing or stringification operator. It is used inside a function-like macro definition by placing # immediately before a parameter. For example, #define STR(x) #x lets STR(hello) expand to the string literal "hello". The preprocessor also escapes quotation marks and backslashes in the resulting text when necessary.
Stringizing captures the argument’s written token sequence before ordinary macro expansion. That detail causes a common surprise: if VALUE is defined as 4, STR(VALUE) produces "VALUE", not "4". A two-level macro, such as XSTR(x) STR(x), can force VALUE to expand before stringization.
The similar-looking ## operator does something different: it pastes two tokens together, such as joining a name and suffix to form one identifier. The symbols @ and % are not C preprocessor stringizing operators.