|
268
|
| Zifre · 技术社区 · 17 年前 |
|
1
321
但是:
在C和C++中意味着不同的东西!在C中,它的意思是“可以接受任何数量的未知类型的参数”,在C++中,它与
变量参数列表函数本质上是不类型安全的,应尽可能避免使用。 |
|
2
100
这是一个参数类型列表:
第一个定义了函数接受特定数量的参数,但既不传递计数,也不传递所需的类型——就像所有使用标识符列表的函数声明一样。因此,呼叫者必须事先准确知道类型和计数。因此,如果调用者调用函数并给它一些参数,则行为是未定义的。例如,堆栈可能会损坏,因为被调用的函数在获得控制权时需要不同的布局。
不推荐在函数参数中使用标识符列表。它在过去被使用,现在仍然存在于许多生产代码中。由于这些参数升级(如果升级的参数类型与函数定义的参数类型不匹配,行为也未定义!),它们可能会造成严重的危险,当然,它们的安全性要低得多。因此,始终使用
第二种声明函数的方式有很多好处。当然,其中之一是检查参数的数量和类型。另一个区别是,由于编译器知道参数类型,它可以将参数的隐式转换应用于参数的类型。如果没有参数类型列表,则无法完成,参数将转换为升级类型(称为默认参数升级)。
第一个使用标识符列表定义函数,而第二个则使用包含参数类型列表的声明为其提供原型。 |
|
|
3
29
|
|
|
4
21
这个答案旨在引用和解释 C99 N1256 standard draft .
术语 声明人
声明器是函数声明和定义的一部分。
定义如下:
它被称为参数类型列表,因为我们必须给出每个参数的类型。
定义如下:
因为 6.7.5.3“函数声明器(包括原型)” 说:
说:
引言 :
6.7.5“申报人”
说:
如果我使用f()声明会发生什么? 6.7.5.3函数声明器(包括原型) :
所以你可以逃脱惩罚:
Why does an empty declaration work for definitions with int arguments but not for float arguments?
兽医
6.7.5.3函数声明器(包括原型) 说:
这看起来与以下描述相似
不符合以下讨论的要求: Why does gcc allow arguments to be passed to a function defined to be with no arguments?
|
|
|
5
10
除了句法差异,许多人还喜欢使用
如果你正在使用搜索功能,并想找到该功能的实现,你可以搜索
|
|
6
9
在C++中,有
例子:
例子:
|