在 Pintos 的资料中有这样的替代品
typedef bool list_less_func (const struct list_elem *a,
const struct list_elem *b,
void *aux);
为什么用参数调用 bool 函数的名称?这个替换的实际使用如下:
void
list_insert_ordered (struct list *list, struct list_elem *elem,
list_less_func *less, void *aux)
{
struct list_elem *e;
ASSERT (list != NULL);
ASSERT (elem != NULL);
ASSERT (less != NULL);
for (e = list_begin (list); e != list_end (list); e = list_next (e))
if (less (elem, e, aux))
break;
return list_insert (e, elem);
}
完全不清楚这种“不同名称”的布尔是如何工作的。你能解释一下吗?
你
typedef
没看错。这里
list_less_func
, 是 的别名bool(const struct list_elem *a, const struct list_elem *b, void *aux)
,也就是接受三个参数并返回 的函数bool
。分别,
list_less_func *less
- 指向函数的指针。如果没有
typedef
a,它看起来像这样:bool (*less)(const struct list_elem *a, const struct list_elem *b, void *aux)
.没有“名字
bool
”,也没有“其他名字bool
”。此声明与bool
. 在这种情况下定义的名称不是bool
,即list_less_func
。该名称list_less_func
将与函数类型同义(题外话:在现代 C++ 语言语法中,使用
using
相同的别名,可以声明为)
在代码中,此名称用于声明指向此类功能类型的指针:
list_less_func *
.此外,您可以注意到在函数参数列表中,函数类型会自动转换为相应的指针类型,即 可以用
没有额外
*
的,效果是一样的。但是代码的作者决定明确指定这一点*
。这是他的口味问题。可能可以直接将“指示性”直接包含在 type
list_less_func
中,即 初步宣布并进一步在代码中编写只是
list_less_func
为了声明一个指向函数的指针。但这也是品味问题。在这种情况下,代码的作者决定不隐藏 typedef 名称下的“指针”,这在原则上是正确的。
题外话:
在这段代码中,这一刻令人困惑
在返回的函数内
void
。C 语言不允许return
在返回的函数内使用参数void
。即使它list_insert
也返回,这也是不允许的void
。在后一种情况下,代码在 C++ 中是正确的,但在 C 中不正确。在 C 中,与 C++ 不同,没有像
bool
. 有一个内置的整数类型_Bool
,它有两个值:1 和 0。但是,您可以在程序
<stdbool.h>
中包含一个头文件,该头文件定义一个bool
扩展为_Bool
.来自 C 标准(6.2.5 类型):
和(7.18布尔类型和值)
在这个广告中
相当于声明
如果您删除关键字
typedef
然后我们得到一个名为 的函数声明
list_less_func
。因此,这为函数类型
typedef
引入了一个符号名称list_less_func
,而不是为 namebool
,正如我已经写过的,它在 header 中定义<stdbool.h>
,即函数类型它有三个参数和一个返回值
bool
。这允许您在函数声明中
list_insert_ordered
简洁地指定第三个参数的类型。怎么样
list_less_func *
。否则,如果没有 typedef,您将不得不
list_insert_ordered
在函数声明中编写一个很长的第三个参数声明,例如,或如何
你看,这使得函数声明
list_insert_ordered
难以阅读。