Imprimir jerarquías de encabezados

Quiero imprimir jerarquías de encabezados de alguna manera automatizada. El objective es mantener el orden en la inclusión de los archivos de cabecera.

He intentado hacer lo siguiente en el encabezado “tmp1.h”:

#ifndef HIERARCHY_PRINTING #define HIERARCHY_PRINTING "start: " #endif #undef PREVIOUS_PRINTING #define PREVIOUS_PRINTING HIERARCHY_PRINTING "->" #undef HIERARCHY_PRINTING #define HIERARCHY_PRINTING PREVIOUS_PRINTING "tmp1.h" #ifndef _TMP1_ #define _TMP1_ // Some stuff #endif #undef PREVIOUS_PRINTING #define PREVIOUS_PRINTING HIERARCHY_PRINTING ";" #undef HIERARCHY_PRINTING #define HIERARCHY_PRINTING PREVIOUS_PRINTING 

Y en “tmp.c”:

 #include  #include "tmp1.h" const char *str = HIERARCHY_PRINTING; int main() { printf("Headers hierarchy:\n"); printf("%s\n", str); return 0; } 

Pero esto no se comstack:

 tmp.c:7:19: error: 'HIERARCHY_PRINTING' undeclared here (not in a function) tmp.c:7:19: error: expected ',' or ';' before string constant 

Esperaba ver algo como:

 start: ->tmp1.h; 

Donde me equivoco

Si entiendo correctamente, intentó guardar algún resultado intermedio en la definición de macro PREVIOUS_PRINTING que debería almacenar los contenidos de la macro HIERARCHY_PRINTING en ese punto para usarlos más adelante, después de que HIERARCHY_PRINTING quede indefinido.

Pero este enfoque no funciona, ya que el preprocesador no despliega definiciones hasta que son necesarias. Y el comando #undef simplemente tira lo que se definió antes. Entonces, para su ejemplo, cuando el preprocesador termine de manejar el archivo de encabezado, tendrá lo siguiente:

 #define PREVIOUS_PRINTING HIERARCHY_PRINTING ";" #define HIERARCHY_PRINTING PREVIOUS_PRINTING 

Entonces, cuando intente desplegar el valor de HIERARCHY_PRINTING obtendrá HIERARCHY_PRINTING ";" y que desde la recursión está prohibida. Y finalmente, el comstackdor se quejará de la no declarada HIERARCHY_PRINTING ya que no hay tales declaraciones en el código.