2010-12-14 15 views
7

que utilizo para ir a través de C código que tiene gran cantidad de #ifdef, #if y #endif directiva que mantener una parte activa y una parte inactiva en función de algunas variables se definen o no. Busqué algo que pueda procesarlos para generar el código final C. Pero el preproceso también hace lo mismo para #include y #define. Pero quiero quedármelos.Procesamiento de algunas directivas dejando a los demás

Entonces, ¿hay algo para preprocesar estos archivos o proyectos con algún tipo de filtrado?

Respuesta

0

Supongo que está utilizando gcc.

Si se refiere a todos los #include s, creo que es necesario para eliminarlos, expanda el archivo resultante con gcc -E continuación, agregue el #includes s espalda.

Si se refiere sólo las cabeceras estándar, la opción -nostdinc puede ayudarle a hacer lo que quiere

[email protected]:~/test/tmp$ cat 4437465.c 
#include <stdio.h> 

#ifndef OUTPUT_TYPE 
#define OUTPUT_TYPE 1 
#endif 

int main(void) { 
#if OUTPUT_TYPE == 1 
    printf("output type 1\n"); 
#elif OUTPUT_TYPE == 2 
    printf("output type 2\n"); 
#else 
    printf("default output type\n"); 
#endif 
    return 0; 
}
[email protected]:~/test/tmp$ gcc -DOUTPUT_TYPE=2 -nostdinc -E 4437465.c 
# 1 "4437465.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "4437465.c" 
4437465.c:1:19: error: no include path in which to search for stdio.h 






int main(void) { 



    printf("output type 2\n"); 



    return 0; 
}
0

lo que desea puede ser en realidad una mala idea, ya que puede haber definiciones procedentes de incluirse archivos, describiendo su arquitectura, por ejemplo ... Pero cualquier IDE moderno puede visualizar las directivas del preprocesador #if.

+0

Este fue mi pensamiento inicial también. Pero también podría procesar los archivos incluidos y escanearlos para definirlos. –

0

Utilizamos un analizador personalizado para lograr lo que pretende hacer. Lex & YACC sería un buen comienzo para dicha herramienta.

En una nota al margen, era una manera realmente dolorosa de administrar diferentes versiones de binarios en una gran base de código. Si es posible, intente aislar las partes del código opcional en diferentes bibliotecas que pueden incluirse o no en su entregable final como una biblioteca dinámica o estática.

+0

¡Si puedes compartir ese analizador personalizado, será genial! – kumar

+0

@kumar: lamentablemente no, no tengo ningún derecho sobre él :( – Matthieu

2

Hay una serie de programas que pueden hacer eso:

I He usado sunifdef extensivamente en un código muy contorsionado y nunca lo he encontrado para cometer un error. Estoy listo para comenzar a usar Coan ahora, aunque todavía estará bajo escrutinio por un tiempo. La versión 4.2.2 fue lanzada hoy, 2010-12-20.

Véase también: SO 525283

+1

Su enlace a coan apunta al proyecto incorrecto, debe ser http://coan2.sourceforge.net/ o http://sourceforge.net/ projects/coan2/ – Hasturkun

+0

@Hatsurkan: Ups, eso fue descuidado, gracias por el aviso. –

Cuestiones relacionadas