2011-02-08 9 views
5

Ho un file di assieme (asm.S), che necessita di una costante #define 'd in un file di intestazione C (c_decls.h). Il file di intestazione contiene dichiarazioni di funzioni C oltre allo #define che desidero. Sfortunatamente, i codici a barre gcc durante il tentativo di compilare il file assembly. Ad esempio,#include intestazione con dichiarazioni C in un file assembly senza errori?

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 

uscita

> 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'

C'è un modo per #include un file di intestazione C che contiene dichiarazioni di funzione in un file di assembly? (Cambiare l'intestazione o lo spostamento/ridefinizione della #define non è un'opzione.)

+0

(Modifica della intestazione o lo spostamento/ridefinizione della #define non è un'opzione.) See come hai squalificato l'opzione più ragionevole, direi che sei sfortunato. :-) – asveikau

+0

Considerando che l'intestazione invoca comportamento non definito (utilizzando un nome che inizia con doppia sottolineatura come la sua guardia multiple-inclusion), penso che si dovrebbe riconsiderare il requisito di non cambiarlo. :-) –

risposta

10

Utilizzare l'opzione -dM per cpp per ottenere solo i #defines su file di intestazione, e comprendono quel file invece.

cpp -dM c_decls.h > bare_c_decls.h 

Ora includere bare_c_decls.h nel file .S. E se non è possibile modificare il # include nel file .S, generare i file di intestazione nudi in un'altra directory, e mettere che includono il percorso sulla linea di comando del compilatore/assemblatore, davanti a tutto il resto.

E, infine, si può avvolgere tutto questo in un makefile in modo che le file di intestazione "nude" vengono generati automaticamente.

+1

semplice '-dM' non funziona per me. Non restituisce nulla. '-E -dM' dump tutti definiti, incluso uno definito in un'intestazione. C'è solo l'inconveniente che ci sono più di 700 definisce nella lista. – user3124812

+0

Quale versione di cpp stai usando? (Nota: la domanda è relativa a gcc) – payne

+0

È GNU GCC, 'arm-none-eabi-g ++ (GNU Tools per ARM Embedded Processors) 4.9.3 20150529 (release)' – user3124812

6

Questo è simle: Nel vostro uso del file .S

#define __ASSEMBLY__ 

In all'utilizzo file .C

#undef __ASSEMBLY__ 

Poi, nel file h luogo condizione

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

L'intestazione deve essere inclusa con "C" come include, "# include my_defs.h", non "ASM" come ".include my_defs.h". In ultimo caso '# ifdef',' # else', '# endif' verrà ignorato da asm parser. Basta inciampare su questo ... – user3124812

+1

'gcc foo.S' già pre-definisce' __ASSEMBLER__' a 1. Quindi puoi semplicemente proteggere tutte le tue cose di sola C con '#ifndef __ASSEMBLER__' –

Problemi correlati