限制在程序集文件中使用#define'd函数/内联函数

时间:2010-01-31 09:26:20

标签: c assembly kernel c-preprocessor bsd

在程序集文件中使用#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文件定义用于汇编文件,而宏定义用于包含头文件的所有其他函数。

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

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

1 个答案:

答案 0 :(得分: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替换。有些人会觉得这很令人不安,但它是预处理器的功能之一,非常有用(当观察到适当的预防措施时)。