【发布时间】:2013-10-15 23:33:10
【问题描述】:
最近,我正在查看 JOS Kernel 的代码(在 MIT 开发,主要是为了帮助像我这样的初学者)并提出一个小疑问,我认为这可能是微不足道的,但无法弄清楚所以在这里发布寻求帮助..
这是来自 ".c" 文件的一小段代码:-
if(n>0)
{
nextfree = ROUNDUP((char *) nextfree, PGSIZE);
result=nextfree;
nextfree+=n;
PADDR(nextfree);
}
对应的“.h”文件:-
/* This macro takes a kernel virtual address -- an address that points above
* KERNBASE, where the machine's maximum 256MB of physical memory is mapped --
* and returns the corresponding physical address. It panics if you pass it a
* non-kernel virtual address.
*/
#define PADDR(kva) \
({ \
physaddr_t __m_kva = (physaddr_t) (kva); \
if (__m_kva < KERNBASE) \
panic("PADDR called with invalid kva %08lx", __m_kva);\
__m_kva - KERNBASE; \
})
现在我有两个关于上述结构的问题-
我们是否应该将
PADDR(nextfree)的值分配给var=PADDR(nextfree)之类的变量,而不是像上面那样直接调用它。效果如何?为什么有人更愿意在头文件中编写如此小而复杂的定义,而不是为指定任务创建一个易于掌握的函数。
【问题讨论】:
-
看起来宏对你没有任何用处;内联定义往往用于优化性能,而不是“普通人看”。
标签: c macros c-preprocessor header-files