最近,我正在瀏覽JOS內核(在麻省理工學院開發的主要學習目的是幫助像我這樣的初學者)的代碼,並提出了一個小問題,我認爲這可能是微不足道的,沒能找出這樣在這裏發帖求助..訪問像宏一樣的函數返回值
這是從「.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)
而不是直接調用它上面的。它將如何工作?爲什麼有人更喜歡在頭文件中編寫如此小而複雜的定義,而不是爲指定任務編寫一個易於掌握的函數。
它看起來好像宏不會爲你做任何有用的事情;內聯定義傾向於用於優化性能,而不是用於「僅僅看看凡人」。 – Floris