简而言之, 就是可以使用 && 获取标签所在的地址, 然后存入一个变量的话, 就可以通过该变量跳转到相应标签.
手册中写到: "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 *` ?
这就是我疑惑的地方.
Issue 声明
这个 issue 是关于设计理念的困惑, 而非代码中的问题或者遇到的 bug. 也许在这里提问不太好, 但是因为此前也 RTFM , RTFSC 和 STFW 过了, 还是没有搞清楚, 所以我真的很想知道原因. 希望能得到一些理解上的帮助, 非常感谢. 如果造成了麻烦, 十分抱歉.
具体内容
在指导手册的 这里 , 我读到以下宏的展开, 具体代码如以下截图:
然后在 GCC 标签地址扩展功能 里, 我读到该功能的使用实例是这样的:
简而言之, 就是可以使用
&&
获取标签所在的地址, 然后存入一个变量的话, 就可以通过该变量跳转到相应标签. 手册中写到: "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 *` ? 这就是我疑惑的地方.如果是因为我对一些知识点认知的很不全面才导致的这个疑惑, 希望大家能给一些参考链接, 感激不尽!!!