Stringification#

include/linux/stringify.h defines:

#define __stringify_1(x...)    #x
#define __stringify(x...)      __stringify_1(x)

Both use # to turn an argument into a string literal. They differ only when the argument is a macro.

# stringifies tokens before expanding any macros in them. So __stringify_1(x) gives you the literal text you passed, macro name included, unexpanded.

__stringify(x) adds one layer of indirection. Since x isn’t touched directly by # inside __stringify, the preprocessor expands x first when it’s passed down to __stringify_1, which then stringifies the expanded result.

Example:

#define KVERSION 6

pr_info("%s\n", __stringify_1(KVERSION));
// "KVERSION"

pr_info("%s\n", __stringify(KVERSION));
// "6"

char *hello = "world";

pr_info("%s\n", __stringify_1(hello));
// "hello"

pr_info("%s\n", __stringify(hello));
// "hello"

For a non-macro token: a variable name, a plain string, there’s nothing to expand, so both macros produce the same output.

Note: The indirection only work when the argument is a #define.