2011-02-08 15 views
5

Tengo un archivo de ensamblaje (asm.S) que necesita una constante #define 'd en un archivo de encabezado C (c_decls.h). El archivo de encabezado contiene declaraciones de función C además del #define que quiero. Lamentablemente, gcc barfs al intentar compilar el archivo de ensamblaje. Por ejemplo,#incluye encabezado con declaraciones C en un archivo de ensamblaje sin errores?

c_decls.h

#ifndef __c_decls_h__ 
#define __c_decls_h__ 

#define I_NEED_THIS 0xBEEF 
int foo(int bar); 

#endif 

asm.S

#include "c_decls.h" 

.globl main 
main: 
    pushl %ebp 
    movl %esp, %ebp 
    movl $I_NEED_THIS, %eax 
    leave 
    ret 

salida

> gcc -m32 asm.S
c_decls.h: Assembler messages:
c_decls.h:6: Error: junk '(int bar)' after expression
c_decls.h:6: Error: suffix or operands invalid for 'int'

¿Hay una manera de #include un archivo de encabezado C que contiene declaraciones de funciones en un archivo de ensamblaje? (Cambiar el encabezado o en movimiento/redefinición de la #define no es una opción.)

+0

(Cambio de la encabezado o mover/redefinir #define no es una opción.) Ver Si ha descalificado la opción más razonable, diría que no tiene suerte. :-) – asveikau

+0

Teniendo en cuenta que el encabezado invoca un comportamiento indefinido (al usar un nombre que comienza con doble subrayado como su guardia de inclusión múltiple), creo que debería reconsiderar el requisito de no cambiarlo. :-) –

Respuesta

10

Utilice la opción -dM para cpp para obtener sólo los #defines fuera de sus archivos de cabecera, e incluir ese archivo en su lugar.

cpp -dM c_decls.h > bare_c_decls.h 

Ahora incluya bare_c_decls.h en su archivo .S. Y si no puede cambiar el #include en el archivo .S, genere los archivos de encabezado desnudo en otro directorio y coloque esa ruta de acceso incluida en la línea de comandos del compilador/ensamblador, antes que cualquier otra cosa.

Y, por último, puede envolver todo esto en un archivo MAKE para que sus archivos de encabezado "desnudos" se generen automáticamente.

+1

Simple '-dM' no funciona para mí. No devuelve nada. '-E -dM' vuelca todas las definiciones, incluida una que está definida en un encabezado. Solo hay inconvenientes de que hay más de 700 definiciones en la lista. – user3124812

+0

¿Qué versión de cpp estás usando? (Tenga en cuenta que la pregunta está relacionada con gcc) – payne

+0

Es GNU GCC, 'arm-none-eabi-g ++ (Herramientas GNU para procesadores integrados ARM) 4.9.3 20150529 (versión)' – user3124812

6

Eso es simle: En su uso de archivos .S

#define __ASSEMBLY__ 

En su utilización archivo .C

#undef __ASSEMBLY__ 

Luego, en lugar de archivos .h condición

 #ifdef __ASSEMBLY__ 
        // here declarations only for assembler 
     #else 
        // here only for C 
     #endif 
        // and here - defines suitable for both 
+0

El encabezado debe incluirse con 'C' como include, '#include my_defs.h', no 'ASM' como' .include my_defs.h'. En el último caso, 'asdef',' # else', '# endif' serán ignorados por el analizador asm. Simplemente tropezar con esto ... – user3124812

+1

'gcc foo.S' ya define previamente' __ASSEMBLER__' a 1. Así que puedes proteger todas tus cosas solo C con '#ifndef __ASSEMBLER__' –

Cuestiones relacionadas