我遇到过一个通知内核关于char设备的方法。
int cdev_add(struct cdev *, dev_t, unsigned);
从 <linux/cdev.h>
不明白,怎么可能传递没有名字的参数(有两个没有名字的参数--第二个和第三个)。甚至,第三个参数 unsigned
有部分类型(unsigned int?char?long?...)。我在某处读到,这是为了让函数重载来 "选择 "正确的构造函数,但是如果是这样的话,是不是应该在头中声明更多的构造函数呢?
这个(从此):
int cdev_add(struct cdev *, dev_t, unsigned);
是一个函数 声明. 它指定了函数接受的三个参数的类型和返回类型:在本例中,函数返回一个 int
,并将参数a struct cdev *
, a dev_t
和一个 unsigned
. 这通常是在头文件中完成的(.h
),这些参数后来被包含在函数中,以便让编译器知道哪些类型被函数处理和返回。
没有参数名的事实 不 意味着参数是可选的。在C语言中没有 "可选参数 "这种东西,最接近的是通过 歧义 (它只能用在参数列表的最后),但你必须自己定义整个行为。一个有效的函数声明也可以指定参数名,但这不是必须的。
这个(从此):
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
{
// ... body skipped for simplicity ...
return 0;
}
是一个函数 定义. 它必须定义所有的参数名和函数的主体,包含实际的代码。
匿名(未命名)参数有两个目的。
dumb
或 unused
,见下图),所以只要查看一下原型,就能猜到它是用来做什么的。