汇编文件中带有 C 声明的 #include 标头没有错误?

发布于 2024-10-16 11:39:02 字数 796 浏览 3 评论 0原文

我有一个汇编文件 (asm.S),它需要 C 头文件 (c_decls.h) 中的常量 #define。除了我想要的#define 之外,头文件还包含 C 函数声明。不幸的是,gcc 在尝试编译汇编文件时遇到了问题。例如,

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:汇编器消息:
c_decls.h:6:错误:表达式后出现垃圾“(int bar)”
c_decls.h:6:错误:后缀或操作数对于“int”无效

有没有办法#include 在汇编文件中包含函数声明的 C 头文件? (更改标题或移动/重新定义 #define 不是一个选项。)

I have an assembly file (asm.S) which needs a constant #define'd in a C header file (c_decls.h). The header file contains C function declarations in addition to the #define I want. Unfortunately, gcc barfs when trying to compile the assembly file. For example,

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

Output

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

Is there a way to #include a C header file that contains function declarations in an assembly file? (Changing the header or moving/redefining the #define is not an option.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

第几種人 2024-10-23 11:39:02

使用 cpp-dM 选项仅从头文件中获取 #defines,并包含该文件。

cpp -dM c_decls.h > bare_c_decls.h

现在将 bare_c_decls.h 添加到您的 .S 文件中。如果您无法更改 .S 文件中的 #include,请在另一个目录中生成裸头文件,并将该包含路径放在编译器/汇编器命令行上,放在其他所有内容之前。

最后,您可以将这一切包装在一个 makefile 中,以便自动生成“裸”头文件。

Use the -dM option for cpp to get just the #defines out of your header files, and include that file instead.

cpp -dM c_decls.h > bare_c_decls.h

Now include bare_c_decls.h in your .S file. And if you can't change the #include in the .S file, generate the bare header files in another directory, and put that include path on your compiler/assembler command line, ahead of everything else.

And finally, you can wrap this all up in a makefile so your "bare" header files are generated automatically.

⒈起吃苦の倖褔 2024-10-23 11:39:02

这很简单:
在您的 .S 文件中使用

#define __ASSEMBLY__

在您的 .C 文件中使用

#undef __ASSEMBLY__

然后在 .h 文件中放置条件

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

That's simle:
In your .S file use

#define __ASSEMBLY__

In your .C file use

#undef __ASSEMBLY__

Then in .h file place condition

       #ifdef __ASSEMBLY__
                  // here declarations only for assembler
       #else
                  // here only for C
       #endif
                  // and here - defines suitable for both
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文