NJU-ProjectN / nemu

NJU EMUlator, a full system x86/mips32/riscv32/riscv64 emulator for teaching
Other
903 stars 196 forks source link

为什么使用 `const void **` #105

Closed happy-riosky closed 2 months ago

happy-riosky commented 2 months ago

Issue 声明

这个 issue 是关于设计理念的困惑, 而非代码中的问题或者遇到的 bug. 也许在这里提问不太好, 但是因为此前也 RTFM , RTFSC 和 STFW 过了, 还是没有搞清楚, 所以我真的很想知道原因. 希望能得到一些理解上的帮助, 非常感谢. 如果造成了麻烦, 十分抱歉.

具体内容

在指导手册的 这里 , 我读到以下宏的展开, 具体代码如以下截图:

image

然后在 GCC 标签地址扩展功能 里, 我读到该功能的使用实例是这样的:

// ...

void *ptr;
ptr = &&foo;
goto *ptr;

foo:

// ...

简而言之, 就是可以使用 && 获取标签所在的地址, 然后存入一个变量的话, 就可以通过该变量跳转到相应标签. 手册中写到: "You can get the address of a label defined in the current function (or a containing function) with the unary operator ‘&&’. The value has type void ." , 也就是说, && 的返回值是 `void 类型的. 因此, 我的疑惑是, 为什么在nemu/include/cpu/decode.h中会选择使用const void __instpat_end = &&concat(__instpatend, name)这种写法, 换句话说, 为什么要用const void 来装载void 的值? 经过一些简单的代码测试, 这种写法在实现跳转功能上是没有问题的, 后面通过goto (__instpat_end);是可以跳转到concat(__instpatend, name)标签处的. 可是, 为什么用const void *, 而不是直接用void ? 或者是const void *` ? 这就是我疑惑的地方.

如果是因为我对一些知识点认知的很不全面才导致的这个疑惑, 希望大家能给一些参考链接, 感激不尽!!!

sashimi-yzh commented 2 months ago

估计是当时手抖多加了一个*, 用const void *更符合手册的描述.

sashimi-yzh commented 2 months ago

已在commit 27e934a8c52c4e9ffd0de07aac6cffafa190e49e 中修复