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

时间:2020-05-04 11:09:46

标签: c linux-device-driver

我遇到了一种通知内核有关char设备的方法:

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

并不清楚,如何传递未命名的参数(有两个没有名称的参数-第二和第三)。而且,第三个参数<linux/cdev.h>具有部分类型(unsigned int?char?long?...)。我在某处读过,是为了函数重载以“选择”正确的构造函数,但是如果这样,不应该在头文件中声明更多这些构造函数?(但是没有),那么我该如何引用此类参数没有名字?

2 个答案:

答案 0 :(得分:3)

此(from here):

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

是一个函数声明。它指定函数采用的三个参数的类型以及返回类型:在这种情况下,函数返回一个int,并以一个struct cdev *,一个dev_t和一个{ {1}}。通常在头文件(unsigned)中完成此操作,该头文件随后会包含在内,以使编译器知道该函数处理和返回了哪些类型。

没有参数名称这一事实 不是 并不意味着参数是可选的。 C中没有“可选参数”之类的东西,最接近的是通过variadic arguments(只能在参数列表的末尾使用),但是您必须定义整个行为你自己有效的函数声明也可以指定参数名称,但这不是必需的。

此(from here):

.h

是函数定义。它必须定义所有参数名称和函数主体,其中包含实际代码。

答案 1 :(得分:2)

匿名(未命名)参数有两个用途:

  • 首先是它们不需要在函数原型中使用,因为原型的唯一目的是告知编译器参数的数量和在调用中使用的参数的类型。为了检查两个原型是否兼容(相同类型),您只需要检查参数顺序和每个参数的类型,而不必检查名称,因此,如果您将原型不带参数名称,则可以轻松检查功能的兼容性。仅在函数实现中需要参数,因此可以在原型中避免使用它们。我个人不建议这样做,因为参数名称通常会在名称中包含一些有关其用途的文档(即使不使用它,您也可以将其称为dumbunused,请参见下面),因此只需查看原型的一个视图,就可以猜出它的用途。
  • 第二点更加详细,您可以避免命名未使用的参数(C不允许在实现中仅在原型中使用未命名的参数,而C ++在实现中使用未命名的参数来表示未使用参数,但是函数接口所必需的-调用者必须提供一个值)在C ++中,情况有所不同:事情是,假设您必须实现一些必须实现前缀接口的函数,但实现不必需要使用这些参数中的一个或多个。如果命名未使用的参数,则在声明以后不使用的参数时可能会收到编译器警告。更糟糕的是,如果您对其命名,并且在函数内部无意中使用它,则会得到有效的代码,但会出错(因为不使用该参数),因此,如果出现一些未声明的变量,则最好报错。尝试使用它。但这是C ++的东西,这个问题被标记为C,所以在此不再赘述。