在C或C ++中,函数声明和函数签名有什么区别?
我知道函数声明,但函数签名对我来说是全新的。有功能签名概念有什么意义?实际使用的两个概念是什么?
谢谢!
答案 0 :(得分:36)
函数声明是函数的原型(如果编译器此时没有看到原型,它可以来自函数定义) - 它包括返回类型,函数名称和类型参数(可选择在C中)。
函数签名是函数声明中用于执行重载解析的部分。由于多个函数可能具有相同的名称(即,它们被重载),因此编译器需要一种方法来确定函数调用应该解析的具有特定名称的几个可能函数中的哪一个。签名是编译器在重载决策中考虑的。具体而言,标准将“签名”定义为:
有关参与重载决策的函数的信息:其参数的类型,如果函数是类成员,则函数本身的cv限定符(如果有)和成员函数所在的类声明。
请注意,返回类型不是函数签名的一部分。正如标准在脚注中所说,“功能签名不包括返回类型,因为它不参与重载决策”。
答案 1 :(得分:6)
该标准定义了两个术语:声明和定义。定义是暂定声明。但是,C99和C ++ 03标准的定义略有不同。
来自C ++ 0x草案:
附录C
8.3.5 更改:在C ++中,声明了一个函数 使用空参数列表不需要 参数。在C中,一个空参数 list表示数量和类型 函数参数未知“
<强>解释强>
1.3.11签名
名称和参数类型列表 (8.3.5)函数,以及 类,概念,概念图或 它所属的名称空间。如果 函数或函数模板是一个 班级成员的签名 另外还包括 cv-qualifiers(如果有的话)和 函数的ref-qualifier(如果有的话) 或功能模板本身。该 受约束成员的签名 (9.2)包括其模板 要求。签名的 另外功能模板 包括其返回类型,模板 参数列表及其模板 要求(如果有的话)。签名 功能模板专业化 包括模板的签名 这是一个专业化和 它的模板参数(是否 明确指定或推断)。 [ 注意:签名用作基础 名称修改和链接.-结束 注意]
答案 2 :(得分:3)
函数签名不包括函数的返回类型或链接类型。
好的,Wikipedia不同意我的回复类型。但是我知道在决定函数调用是否与签名匹配时,编译器不会使用返回类型。之前的StackOverflow问题似乎同意:Is the return type part of the function signature?
答案 3 :(得分:1)
另请注意,根据标准,参数中的顶级const和volatile不是签名的一部分。但是有些编译器错了。
e.g。
void f(const int, const char* const);
与
具有相同的签名void f(int, const char*);
答案 4 :(得分:-1)
函数声明是原型。函数签名表示返回类型和构成签名的参数。考虑一下:
int foo(int, int); /* Function Declaration */ /* Implementation of foo ** Function signature */ int foo(int a, int b){ }
现在,考虑这种情况:程序员被问到foo
的功能签名是什么:
int
int
,分别命名为a
和b
另一方面,函数原型是在C / C ++编译器中提供线索,如果签名与原型不匹配,编译器将在'函数声明的上下文中发出错误错误'或'原型不匹配'。