c++cpreprocessorstringification

Hash symbol after define macro?


What does the '#' symbol do after the second define? And isn't the second line enough? Why the first one?

#define MAKESTRING(n) STRING(n)
#define STRING(n) #n

Solution

  • This is stringize operation, it will produce a string literal from macro parameter, e.g. "n". Two lines are required to allow extra expantion of macro parameter, for example:

    // prints __LINE__ (not expanded)
    std::cout << STRING(__LINE__) << std::endl;
    // prints 42 (line number)
    std::cout << MAKESTRING(__LINE__) << std::endl;