在 C 或 C++ 中,函数声明和函数签名有什么区别?
我了解一些函数声明的知识,但函数签名是全新的概念。为什么要有函数签名这个概念?这两个概念实际上用于什么?
谢谢!
我了解一些函数声明的知识,但函数签名是全新的概念。为什么要有函数签名这个概念?这两个概念实际上用于什么?
谢谢!
一个函数声明是一个函数的原型(如果编译器在这一点上没有看到原型,它可以来自函数定义)- 它包括返回类型、函数名称和参数类型(在 C 中是可选的)。
函数签名是函数声明的一部分,用于执行重载决议。由于多个函数可能具有相同的名称(即它们被重载了),编译器需要一种确定特定名称的几个可能函数中的哪一个函数调用应解析为的方法。签名是编译器在重载决议中考虑的内容。具体而言,标准将“签名”定义为:
参与重载决议的函数信息:其参数的类型以及,如果该函数是类成员,则该函数本身和声明该成员函数的类中的 cv-qualifiers(如果有)。
请注意,返回类型不是函数签名的一部分。正如标准在一条脚注中所说,“函数签名不包括返回类型,因为返回类型不参与重载决议”。
void foo();
是一个函数声明,在C中不引入原型。实际上,这个问题不应该标记为C,因为在C中没有“函数签名”的概念。这纯粹是一个C++的问题,因此答案不应提到任何“原型”。 - AnT stands with Russia函数签名不包括函数的返回类型或链接类型。
好的,维基百科和我对于是否包含返回类型存在分歧。然而,我知道编译器在决定函数调用是否匹配签名时不使用返回类型。这个之前的StackOverflow问题似乎也同意:返回类型是否是函数签名的一部分?
static
和 extern
是存储类,它们可以适用于 C 和 C++ 中的函数。 - dirkgently请注意,根据标准,参数的顶层const和volatile不是签名的一部分。但有些编译器会出现错误。
例如:
void f(const int, const char* const);
与...具有相同的签名
void f(int, const char*);
函数声明是一个原型。函数签名指示返回类型和参数,这些组成了签名。考虑以下内容:
int foo(int, int); /* 函数声明 */
/* foo的实现 ** 函数签名 */ int foo(int a, int b){ }
现在,考虑以下情况:程序员被问及foo
的函数签名:
int
数据类型int
数据类型,分别命名为a
和b
另一方面,函数原型是为了提示C/C++编译器应该期望什么,如果签名与原型不匹配,编译器将发出错误,上下文为“函数声明错误”或“原型不匹配”。
int f();
就是一个例子。 - Alok Singhal