![]() |
1
33
函数声明是一个函数的原型(或者如果编译器当时没有看到原型,它可以来自函数定义)——它包括返回类型、函数名和参数类型(可选的是C语言)。 函数签名是编译器用来执行重载解析的函数声明的一部分。由于多个函数可能具有相同的名称(即,它们被重载),编译器需要一种方法来确定函数调用应解析的具有特定名称的几个可能函数中的哪一个。签名是编译器在重载解析中考虑的内容。具体来说,标准将“签名”定义为:
请注意,返回类型不是函数签名的一部分。正如标准在脚注中所说,“函数签名不包括返回类型,因为它不参与重载解析”。 |
![]() |
2
6
该标准定义了两个术语:声明和定义。定义是一种暂定声明。然而,C99和C++ 03标准有稍微不同的定义。 从C++ 0X草稿中得出:
|
![]() |
3
3
函数签名不包括函数的返回类型或链接类型。 好啊, Wikipedia 对于包含的返回类型,我不同意。但是,我知道编译器在决定函数调用是否与签名匹配时不使用返回类型。上一个stackoverflow问题似乎同意: Is the return type part of the function signature? |
![]() |
4
1
另外,请注意,根据标准,顶级const和volatile on参数不是签名的一部分。但有些编译器却错了。 例如
签名与
|
![]() |
5
-1
函数声明是原型。函数签名表示返回类型和组成签名的参数。考虑一下: int foo(int, int); /* Function Declaration */ /* Implementation of foo ** Function signature */ int foo(int a, int b){ }
现在,考虑一下这个场景:一个程序员被问到什么是函数签名
另一方面,函数原型是在C/C++编译器中的线索,在期望的情况下,如果签名与原型不匹配,编译器将沿着“函数声明错误”或“原型失配”的上下文发出错误。 |