在学习操作系统相关的东西,找了一份教学用的源码在看,其中在一个初始化页表的地方发现了这样的代码:
... for (i = 0; i < memmap->nr_map; i ++) { uint64_t begin = memmap->map[i].addr, end = begin + memmap->map[i].size; cprintf(" memory: %08llx, [%08llx, %08llx], type = %d.\n", memmap->map[i].size, begin, end - 1, memmap->map[i].type); if (memmap->map[i].type == E820_ARM) { if (maxpa < end && begin < KMEMSIZE) { maxpa = end; } } } if (maxpa > KMEMSIZE) { maxpa = KMEMSIZE; } extern char end[]; npage = maxpa / PGSIZE; pages = (struct Page *)ROUNDUP((void *)end, PGSIZE); for (i = 0; i < npage; i ++) { SetPageReserved(pages + i); } uintptr_t freemem = PADDR((uintptr_t)pages + sizeof(struct Page) * npage); for (i = 0; i < memmap->nr_map; i ++) { uint64_t begin = memmap->map[i].addr, end = begin + memmap->map[i].size; if (memmap->map[i].type == E820_ARM) { if (begin < freemem) { begin = freemem; } ...
注意这里面的end这个变量,这里贴的代码都是在一个函数里面的。本人觉得非常奇怪的是这里面在第一个for循环里面定义了一个end变量后,又extern了一个char类型的名为end的数组变量,然后在第二个for循环里面又定义了一次end变量。这在语法上应该怎么理解呢?在实际使用end这个变量的时候使用的是函数内的局部变量还是extern的全局变量呢?为什么在第二个循环里面又要定义一次end变量呢?
解决方案
40
就近原则,听说过么?
并且你所说的第一个循环里的end,既然是局部变量,循环的大括号就是它的作用域范围啊,对于大括号外面,它是不可见的。
并且你所说的第一个循环里的end,既然是局部变量,循环的大括号就是它的作用域范围啊,对于大括号外面,它是不可见的。