O que '#' exatamente faz em C? [duplicado

Esta pergunta já tem uma resposta aqui:

Stringification - como funciona? 2 respostasPor que não estou obtendo a saída esperada no programa c a seguir? [duplicado 3 respostas

Tenho um programa.

#include <stdio.h>

#define f(a,b) a##b
#define g(a)   #a
#define h(a) g(a)

int main()
{
      printf("%s\n",h(f(1,2)));
      printf("%s\n",g(f(1,2)));
      return 0;
}

Este programa está funcionando corretamente e fornecendo resultados como:

12
f(1, 2)

Eu não entendo como o compilador está dando essa saíd

Qual é a função de # ema##b e#a?

questionAnswers(3)

yourAnswerToTheQuestion