0

在汇编文件中使用#define 函数/内联函数是否有任何限制。

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

在c文件中splx被定义为function, 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文件定义用于汇编文件,而宏定义用于包含头文件的所有其他函数。

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

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

4

1 回答 1

0

在头文件中,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 替换。有些人会觉得这令人不安,但它是预处理器的功能之一,并且非常有用(当采取适当的预防措施时)。

于 2010-01-31T10:47:07.483 回答