函数声明和签名有什么区别?

Tim*_*Tim 38 c c++ declaration function signature

在C或C++中,函数声明和函数签名有什么区别?

我知道一些函数声明,但函数签名对我来说是全新的.有功能签名概念有什么意义?实际使用的两个概念是什么?

谢谢!

Mic*_*urr 42

函数声明是函数的原型(或者如果编译器在那时没有看到原型,它可以来自函数定义) - 它包括返回类型,函数名称和参数类型(任选地在C)中.

函数签名是函数声明中用于执行重载解析的部分.由于多个函数可能具有相同的名称(即,它们被重载),因此编译器需要一种方法来确定函数调用应该解析的具有特定名称的几个可能函数中的哪一个.签名是编译器在重载决策中考虑的.具体而言,标准将"签名"定义为:

有关参与重载决策的函数的信息:参数的类型,如果函数是类成员,则函数本身的cv限定符(如果有)以及声明成员函数的类.

请注意,返回类型不是函数签名的一部分.正如标准在脚注中所说,"功能签名不包括返回类型,因为它不参与重载决策".

  • 说“函数声明是原型”并不完全正确。在C ++中,它实际上是正确的,但在术语上是错误的,因为在C ++中,没有“原型”之类的术语。在C语言中,这是完全不正确的,因为在C语言中,函数声明不一定是原型。例如,“ void foo();”是一个函数声明,它没有在C中引入原型。实际上,由于C中没有“函数签名”的概念,因此不应将此问题标记为C。一个C ++问题,因此,答案中不应提及任何“原型”。 (2认同)
  • 你能引用消息来源吗? (2认同)
  • 您引入了“签名”、“声明”、“原型”和“定义”,但没有明确区分。您能否编辑此内容以添加每个的具体示例? (2认同)

dir*_*tly 6

该标准定义了两个术语:声明和定义.定义是暂定声明.但是,C99和C++ 03标准的定义略有不同.

来自C++ 0x草案:

附录C.

8.3.5更改:在C++中,使用空参数列表声明的函数不带参数.在C中,空参数列表表示函数参数的数量和类型未知"

定义

1.3.11签名

函数的名称和参数类型列表(8.3.5),以及它所属的类,概念,概念图或命名空间.如果函数或函数模板是类成员,则其签名还包括函数或函数模板本身上的cv限定符(如果有)和ref-qualifier(如果有).受约束成员(9.2)的签名包括其模板要求.函数模板的签名还包括其返回类型,模板参数列表及其模板要求(如果有).函数模板特化的签名包括作为特化的模板的签名及其模板参数(无论是明确指定还是推导).[注意:签名用作名称修改和链接的基础.-end note]

  • 谢谢,但我觉得很难理解你想说什么。 (2认同)
  • @Tim:1)C标准没有定义术语签名.它松散地用于一般编程文献中,并且通常与函数声明同义.请注意,函数声明不需要参数.但是,如果您在定义中使用它们,则可以使用定义.2)编译器广泛使用签名来例如提供标识符的定义,并且在C++的情况下选择最佳过载. (2认同)

Mar*_*som 5

函数签名不包括函数的返回类型或链接类型。

好吧,维基百科不同意我关于包含返回类型的观点。但是我知道编译器在确定函数调用是否与签名匹配时不使用返回类型。之前的 StackOverflow 问题似乎同意:返回类型是函数签名的一部分吗?