代码之家  ›  专栏  ›  技术社区  ›  Tim unnamed eng

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

  •  31
  • Tim unnamed eng  · 技术社区  · 15 年前

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

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

    谢谢!

    5 回复  |  直到 6 年前
        1
  •  33
  •   jr-juxtaposition    8 年前

    函数声明是一个函数的原型(或者如果编译器当时没有看到原型,它可以来自函数定义)——它包括返回类型、函数名和参数类型(可选的是C语言)。

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

    有关参与重载解析的函数的信息:其参数的类型,如果函数是类成员,则函数本身和声明成员函数的类上的cv限定符(如果有)。

    请注意,返回类型不是函数签名的一部分。正如标准在脚注中所说,“函数签名不包括返回类型,因为它不参与重载解析”。

        2
  •  6
  •   dirkgently    15 年前

    该标准定义了两个术语:声明和定义。定义是一种暂定声明。然而,C99和C++ 03标准有稍微不同的定义。

    从C++ 0X草稿中得出:

    附录C

    8 3.5 更改:在C++中,声明一个函数 参数列表为空时不接受 争论。在C语言中,一个空参数 列表是指 函数参数未知“

    定义

    1.3.11签字

    名称和参数类型列表 (8.3.5)功能,以及 类、概念、概念图,或 它是其成员的命名空间。如果 函数或函数模板是 类成员的签名 另外还包括 简历限定符(如有)和 函数上的引用限定符(如果有) 或者函数模板本身。这个 受约束成员的签名 (9.2)包括其模板 要求。A的签名 附加功能模板 包括其返回类型和模板 参数列表及其模板 要求(如有)。签名 函数模板专业化 包括模板的签名 它是一个专门化的 其模板参数(是否 明确规定或推导)。[ 注:签名作为基础 用于名称管理和链接。结束 注释

        3
  •  3
  •   Community CDub    8 年前

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

    好啊, Wikipedia 对于包含的返回类型,我不同意。但是,我知道编译器在决定函数调用是否与签名匹配时不使用返回类型。上一个stackoverflow问题似乎同意: Is the return type part of the function signature?

        4
  •  1
  •   Ben Voigt    15 年前

    另外,请注意,根据标准,顶级const和volatile on参数不是签名的一部分。但有些编译器却错了。

    例如

    void f(const int, const char* const);
    

    签名与

    void f(int, const char*);
    
        5
  •  -1
  •   t0mm13b    6 年前

    函数声明是原型。函数签名表示返回类型和组成签名的参数。考虑一下:

    int foo(int, int);  /* Function Declaration */
    
    
    /* Implementation of foo 
    ** Function signature
    */
    int foo(int a, int b){
    }
    

    现在,考虑一下这个场景:一个程序员被问到什么是函数签名 foo :

    • 它返回的数据类型为 int
    • 两个参数的数据类型也是 int 命名 a b 分别地

    另一方面,函数原型是在C/C++编译器中的线索,在期望的情况下,如果签名与原型不匹配,编译器将沿着“函数声明错误”或“原型失配”的上下文发出错误。

    推荐文章