匿名参数是什么意思?为什么需要它们?

问题描述 投票:0回答:1

我遇到过一个通知内核关于char设备的方法。

int cdev_add(struct cdev *, dev_t, unsigned);

<linux/cdev.h> 不明白,怎么可能传递没有名字的参数(有两个没有名字的参数--第二个和第三个)。甚至,第三个参数 unsigned 有部分类型(unsigned int?char?long?...)。我在某处读到,这是为了让函数重载来 "选择 "正确的构造函数,但是如果是这样的话,是不是应该在头中声明更多的构造函数呢?

c linux-device-driver
1个回答
3
投票

这个(从此):

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;
}

是一个函数 定义. 它必须定义所有的参数名和函数的主体,包含实际的代码。


2
投票

匿名(未命名)参数有两个目的。

  • 第一个目的是它们不需要用在函数原型中,因为原型的唯一目的是告知编译器参数的数量和调用中使用的参数类型。 为了检查两个原型是否兼容(同一类型),你只需要检查参数顺序和每个参数的类型,但不需要检查名称,所以如果你把原型中没有参数名称,你可以很容易地检查函数的兼容性。 参数只在函数实现中需要,所以在原型中可以避免。 我个人不建议这样做,因为参数名中一般都会有一些关于它的用途的文档(即使不使用,因为你可以把它叫做 dumbunused,见下图),所以只要查看一下原型,就能猜到它是用来做什么的。
  • 第二种情况比较复杂,你可以避免命名一个未使用的参数(C语言不允许在实现中使用未命名的参数,只是在原型中使用,而C++在实现中使用未命名的参数是为了表明这些参数不是用来的,而是函数接口所需要的---调用者必须提供一个值)在C++中,情况是不同的:事情是这样的,假设你必须实现一些函数,这些函数必须实现一个前缀的接口,但实现中不需要使用一个或多个参数。 如果你给未使用的参数命名,你很可能会得到一个编译器警告,因为你声明了一个后来你不用的参数。 更糟糕的是,如果你命名了它,并在函数内部无意中使用了它,你会得到有效的代码,但却是错误的(因为那个参数是不需要使用的),所以如果你试图使用它,最好是得到一个关于某个未声明变量的错误。 但这是C++的东西,而且这个问题被打上了C的标签,所以我就不多做延伸了。
© www.soinside.com 2019 - 2024. All rights reserved.