限制在汇编文件中使用 #define 函数/内联函数
在程序集文件中使用 #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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在头文件中,splx 被定义为
我不确定为什么当这种语言显然是 C 时你要引用汇编文件,但我认为这些声明没有任何问题 - splx 是一个函数,但如果定义了 EVBARM_SPL_NOINLINE ,则宏用于将 splx 的所有使用重新映射到 splx_omap。这是预处理器的有效使用,并且不是重新定义 splx - 而是使用一些技巧来修改代码以使用 splx_omap。
这是有效的,因为预处理器在编译器之前运行,因此在编译之前出现的任何 splx 都将被 splx_omap 替换。有些人会觉得这令人不安,但它是预处理器的功能之一,并且非常有用(当遵守适当的预防措施时)。
In the header file, splx is defined as
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).