c++ - macro - ¿Puedo expandir#include archivos en línea y no expandir directivas?
c++ macro definition (3)
Estoy tratando de simplificar el despliegue de una aplicación. Para construir la aplicación final en la máquina del usuario final, es necesario compilar un par de archivos C. Esto significa que se deben enviar docenas de archivos de encabezado junto con la aplicación. Me gustaría poder #if
el contenido de los archivos de inclusión, pero también debo poder controlar las directivas ( #if
, etc.) después de incluir las #if
. No puedo encontrar una opción de cpp que me permita simplemente incluir encabezados, sin hacer el resto del preprocesamiento. ¿Cuáles son mis opciones?
Ejemplo:
Archivo1.h
void dummy_func()
{return;}
File2.h
#if INCLUDE_FILE1
#include "file1.h"
#endif
Al final, quiero un archivo que diga:
#if INCLUDE_FILE1
void dummy_func()
{return;}
#endif
Para construir la aplicación final en la máquina del usuario final, es necesario compilar un par de archivos C. Esto significa que se deben enviar docenas de archivos de encabezado junto con la aplicación.
¿Y qué? Si pones todos los archivos (incluidos los encabezados) en un tarball, y tienes un sistema de compilación sano (al menos tienes un Makefile, ¿no?), ¿Cuál es el problema de tener muchos archivos?
¿Qué pasa con el uso de un #ifdef para controlar qué secciones #if se compilan?
Debido a la doble inclusión de guardias, una herramienta que incluye #includes puede causar un archivo gigante, donde muchos de los encabezados están completamente dentro de #ifndefs que no coinciden. En casos extremos, puede incluso causar un archivo de salida de tamaño infinito, si las inclusiones son recursivas (lo que normalmente no es un problema debido a las guardias de doble inclusión).
Acabo de confirmar que este código compila con éxito:
main.cpp:
#include "a.h"
int main() { return 0; }
ah:
#ifndef A_H_INCLUDED
#define A_H_INCLUDED
#include "b.h"
#endif
bh:
#ifndef B_H_INCLUDED
#define B_H_INCLUDED
#include "a.h"
#endif
Como desea mantener ifdefs intactos y sin analizar, una herramienta que incluya #includes
provocaría un resultado infinito.