限制在汇编文件中使用 #define 函数/内联函数

发布于 2024-08-19 17:52:55 字数 849 浏览 14 评论 0原文

在程序集文件中使用 #define'd 函数/内联函数是否有任何限制。

我提到了 bsd 内核,其中定义了两种不同的实现。 一个是宏,另一个是普通函数(两者都是相同的函数)

在c文件中splx被定义为函数, http://ftp.hu.freebsd.org/pub/netbsd/NetBSD-release-4-0/src/sys/arch/arm/omap/omap_intr.c

而在 h 头文件 splx 中定义为宏观, http://ftp.hu.freebsd.org/pub/netbsd/NetBSD-release-4-0/src/sys/arch/arm/omap/omap_intr.h

我的理解是c文件定义用于汇编文件,而宏定义用于包含头文件的所有其他函数。

我想我不清楚为什么装配会出现在这里。 splx 基本上有两个定义,一个在 c 文件中,另一个在 h 文件中。当我在 C 文件中注释掉 splx 定义时,我在汇编文件的编译中遇到一些错误。(cpu.S)这就是为什么我认为在编译汇编文件时使用函数定义(如在 c 文件中),而宏定义是用于所有其他文件,包括 h 文件。

现在我的问题是:为什么汇编文件也不能通过包含头文件来使用宏定义?

Is there any restriction on using #define'd functions/inline functions inside Assembly files.

I referred bsd kernel in which two different implementations are defined.
One is macro and other is a normal function ( both are for same function)

In the c file splx is defined asfunction,
http://ftp.hu.freebsd.org/pub/netbsd/NetBSD-release-4-0/src/sys/arch/arm/omap/omap_intr.c

Whereas in h header file splx is defined as macro,
http://ftp.hu.freebsd.org/pub/netbsd/NetBSD-release-4-0/src/sys/arch/arm/omap/omap_intr.h

My understanding is c file definition is used in assembly files whereas macro definition is used in all other functions where the header file is included.

I think I m not clear why assembly is coming into picture here. Basically there are two definitions , one in the c file and another in h file for splx. When I just comment out splx definition in C fle, I get some errors in the compilation of Assembly files.(cpu.S) Thatz why I thought function definition is used(as in c file) while compiling assembly file, whereas macro definition is used for all other files include the h file.

Now my question is: Why can't assembly file too cannot use the macro definition by including the header file?

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

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

发布评论

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

评论(1

白芷 2024-08-26 17:52:55

在头文件中,splx 被定义为

void splx(int)
void _setsoftintr(int);

#if !defined(EVBARM_SPL_NOINLINE)
#define splx(new) omap_splx(new)
#define _spllower(ipl) omap_spllower(ipl)
#define _setsoftintr(si) omap_setsoftintr(si)
#endif /* !EVBARM_SPL_NOINTR */ 

我不确定为什么当这种语言显然是 C 时你要引用汇编文件,但我认为这些声明没有任何问题 - splx 是一个函数,但如果定义了 EVBARM_SPL_NOINLINE ,则宏用于将 splx 的所有使用重新映射到 splx_omap。这是预处理器的有效使用,并且不是重新定义 splx - 而是使用一些技巧来修改代码以使用 splx_omap。

这是有效的,因为预处理器在编译器之前运行,因此在编译之前出现的任何 splx 都将被 splx_omap 替换。有些人会觉得这令人不安,但它是预处理器的功能之一,并且非常有用(当遵守适当的预防措施时)。

In the header file, splx is defined as

void splx(int)
void _setsoftintr(int);

#if !defined(EVBARM_SPL_NOINLINE)
#define splx(new) omap_splx(new)
#define _spllower(ipl) omap_spllower(ipl)
#define _setsoftintr(si) omap_setsoftintr(si)
#endif /* !EVBARM_SPL_NOINTR */ 

I'm not sure why you're referring to assembly files when this language is clearly C, but I see nothing wrong with these declarations - splx is a function, but if EVBARM_SPL_NOINLINE is defined then the macro is used to remap all uses of splx to splx_omap. This is a valid use of the preprocessor, and is not redefining splx - rather using some trickery to modify code to use splx_omap.

This works because the preprocessor runs before the compiler, so any occurence of splx will be replaced by splx_omap before compilation takes place. Some people would find this disturbing but it's one of the capabilities of the preprocessor and is quite useful (when proper precautions are observed).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文