2011-02-08 67 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