STRINGIZE preprocessor directive

I have code where I want to sometimes insert a value as an integer and sometimes insert it as a string literal.

I can see that the macro name is expanded to a string in this example, so how to do what I want?

#define makeString(x) #x
#define PRODUCT_ID 12345

void setup(void)
{
  Serial.begin(9600);
  Serial.print("As an int:\t");
  Serial.println(PRODUCT_ID);
  Serial.print("As as a string literal:\t");
  Serial.println(makeString(PRODUCT_ID));
}

void loop(){}

ahhhh, i figured it out...

#define makeString(s) str(s)
#define str(s) #s
#define PRODUCT_ID 12345

void setup(void)
{
  Serial.begin(9600);
  Serial.print("As an int:\t");
  Serial.println(PRODUCT_ID);
  Serial.print("As as a string literal:\t");
  Serial.println(makeString(PRODUCT_ID));
}