2011-02-08 72 views
5

我有一个汇编文件(asm.S),它需要在C头文件(c_decls.h)中保持不变的#define'd。除了我想要的#define之外,头文件还包含C函数声明。不幸的是,当试图编译程序集文件时,gcc barfs。例如,#include包含C声明的程序集文件中没有错误?

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 

输出

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

有没有一种办法#include包含程序集文件中函数声明的C头文件? (更改头部或移动/重新定义#define不是一个选项。)

+0

您.S文件使用

#define __ASSEMBLY__ 

在你.C文件使用

#undef __ASSEMBLY__ 

然后(更改标题或移动/重新定义#define不是一个选项。) 请参阅因为你已经取消了最合理的选择资格,我会说你运气不好。 :-) – asveikau 2011-02-08 00:14:48

+0

考虑到头文件调用了未定义的行为(通过使用以双下划线开头的名称作为其多重包含守卫),我认为你应该重新考虑不改变它的要求。 :-) – 2011-02-08 00:32:14

回答

10

使用-dM选项cpp得到公正#定义出你的头文件,并包括文件代替。

cpp -dM c_decls.h > bare_c_decls.h 

现在在您的.S文件中包含bare_c_decls.h。如果无法更改.S文件中的#include,请在另一个目录中生成裸头文件,然后将其放在编译器/汇编程序命令行上,然后放在其他目录中。

最后,你可以将它们全部包装到makefile中,以便自动生成“裸”头文件。

+1

简单的`-dM`不适合我。它什么都不返回。 `-E -dM`转储所有的定义,包括一个在头文件中定义的定义。只有列表中有超过700个定义的不便之处。 – user3124812 2017-03-03 04:50:40

6

这是笑着: 在.h文件中的地方条件

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