2010-01-31 23 views
0

在Assembly文件中使用#defined'd函数/内联函数是否有任何限制。在Assembly文件中使用#defined'd函数/内联函数的限制

我引用了bsd内核,其中定义了两种不同的实现。 一个是宏等是被定义的asfunction一个正常功能(二者都是相同的功能)

在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文件中,另一个在splx的h文件中。当我刚刚在C语言中注释掉splx定义时,我在汇编汇编文件时遇到了一些错误。(cpu.S)Thatz为什么我在编译汇编文件时使用函数定义(如在c文件中),而宏定义是用于所有其他文件包括h文件。

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

+0

您是否找到答案或者您在寻找进一步的帮助? – 2010-02-07 04:33:29

+0

寻找更多帮助 – kumar 2010-02-07 18:34:54

回答

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替换。有些人会觉得这很令人不安,但这是预处理器的功能之一,并且非常有用(如果遵守适当的预防措施)。

+0

嗨Sam, 谢谢! 我想我不清楚为什么大会在这里进入图片。 基本上有两个定义,一个在c文件中,另一个在这里用于splx。 (cpu.S) Thatz为什么我认为在编译程序集文件时使用了函数定义(如在c文件中),所以在编译程序集文件时会出现一些错误,而宏定义用于所有其他文件包括h文件。 现在我的问题是,为什么不能使用汇编文件也不能通过包含头文件来使用宏定义。 – kumar 2010-01-31 11:12:01

+0

如果定义了EVBARM_SPL_NOINLINE,宏定义仅用于强制splx的所有调用者使用splx_omap。 cpu.S的编译可能没有定义EVBARM_SPL_NOINLINE,这就是为什么当splx在C文件中被注释掉时出现错误的原因。如果您希望cpu.S使用splx_omap,然后定义EVBARM_SPL_NOINLINE或通过编辑所有文件来更新splx的所有调用者以使用splx_omap。这有帮助吗? – 2010-01-31 11:25:53