2010-02-24 180 views
29

在C或C++中,函數聲明和函數簽名有什麼區別?函數聲明和簽名有什麼區別?

我知道一些函數聲明,但函數簽名對我來說是全新的。擁有函數簽名的概念有什麼意義?實際使用的兩個概念是什麼?

謝謝!

+4

形式上,有作爲C.「功能簽名」在C語言中沒有這樣的事有根本不需要「函數簽名」的概念。你的問題純粹是C++。在C中完全沒有意義。 – AnT 2010-03-08 16:35:08

回答

28

函數聲明是原型的功能(或者它可以來自函數定義如果沒有原型已經通過在該點處的編譯器看到的) - 它包括返回類型,功能和類型的名稱的參數(可選地在C中)。

函數簽名是編譯器使用以執行重載解析函數聲明的部分。由於多個功能可能具有相同的名稱(例如,他們是過載),編譯器需要一種方法來確定哪幾種可能的功能與特定名稱的函數調用應該下定決心。簽名是編譯器在重載解析中考慮的內容。具體而言,該標準將'簽名'定義爲:

有關參與重載解析的函數的信息:其參數的類型,如果函數是類成員,則cv限定符(如果有)在函數本身和聲明成員函數的類上。

注意,返回類型不是函數簽名的一部分。正如標準在腳註中所述,「函數簽名不包含返回類型,因爲它不參與重載解析」。

+0

我喜歡「可選在C中」。非常好的答案。 – 2010-02-24 03:34:26

+1

+1,我比我自己更喜歡這個答案。 – 2010-02-24 04:22:35

+1

說「功能聲明是原型」並不完全正確。在C++中它實際上是正確的,但術語錯誤,因爲在C++中沒有「原型」這樣的術語。在C中,它是嚴格不正確的,因爲在C函數聲明中不一定是原型。例如,'void foo();'是一個函數聲明,它不會在C中引入原型。實際上,這個問題不應該被標記爲C,因爲C中沒有「函數簽名」的概念。它純粹是一個C++的問題,因此,答案不應該提及任何「原型」。 – AnT 2010-03-08 16:33:34

3

函數簽名不包含函數的返回類型或鏈接類型。

好的,Wikipedia不同意我的退貨類型被包括在內。不過,我知道編譯器在決定函數調用是否與簽名匹配時不使用返回類型。此前StackOverflow問題似乎同意:Is the return type part of the function signature?

+0

「存儲類」是指函數所屬的類嗎?擁有函數簽名的概念有什麼意義?謝謝! – Tim 2010-02-24 00:10:33

+0

@Tim:不。他們指的是適用的聯繫。 – dirkgently 2010-02-24 00:15:33

+0

我現在不會在維基百科的文章中提供太多的信任。它寫得不好。 *方法簽名*文章稍好一些。 – 2010-02-24 00:16:22

6

該標準定義了兩個術語:聲明和定義。定義是一個暫定的聲明。但是,C99和C++ 03標準的定義稍有不同。

從的C++ 0x草案:

附錄C

8.3.5變化:在C++中,函數聲明 與空參數列表不帶任何參數 。在C語言中,一個空的參數列表 指的數量和類型 函數參數未知」

定義

1.3.11簽名

的名稱和參數類型-list (8.3.5)的功能,以及 類,概念,概念圖或 它是其成員的名稱空間。如果 功能或函數模板是 類成員其簽名 另外還包括 函數 或函數模板本身的cv-限定符(如果有)和 ref-qualifier(如果有)。約束成員 (9.2)的 簽名包括其模板 的要求。 功能模板的簽名額外 包括其返回類型,其模板 參數列表及其模板 要求(如果有)。功能模板專業化 的簽名 包括模板 的簽名,其模板參數(無論是明確指定還是推導出 )是其專業化模板和 。 [ 注:簽名被用作名稱重整和linking.端 音符的基礎 ]

+1

謝謝,但我很難理解你想說什麼。 – Tim 2010-02-24 00:16:44

+0

我知道函數聲明,但函數簽名對我來說是全新的。擁有函數簽名的概念有什麼意義?實際使用的兩個概念是什麼? – Tim 2010-02-24 00:22:29

+2

@Tim:1)C標準沒有定義術語簽名。它通常用於一般的編程文獻中,通常是函數聲明的同義詞。請注意,函數聲明不需要參數。但是,定義的確如果你在定義中使用它們。 2)編譯器將簽名廣泛用於例如爲標識符提供一個定義,並在C++的情況下選擇最佳的重載。 – dirkgently 2010-02-24 00:26:38

0

函數聲明是原型。函數簽名指示組成簽名的返回類型和使用的參數。試想一下:

 
int foo(int, int); /* Function Declaration */ 


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

現在,考慮這樣的場景:一個程序員問什麼是foo函數簽名:

  • 它返回的int
  • 兩個參數的數據類型是數據類型也int,分別命名爲ab分別爲

T在另一方面,他的函數原型是線索,在C/C++編譯器,在什麼期望,如果簽名不與原型相匹配,編譯器將發出一個錯誤,沿着「函數聲明錯誤」或上下文'原型不匹配'。

希望這會有所幫助, 最好的問候, 湯姆。

+0

謝謝!所以函數簽名是函數定義中對應於函數聲明的部分? – Tim 2010-02-24 00:40:03

+0

@Tim:是的。究竟。 :)希望對你有意義嗎? – t0mm13b 2010-02-24 00:44:24

+0

在C中,函數聲明可能不是原型:'int f();'是一個例子。 – 2010-02-24 01:27:26

1

同時請注意,頂級const和volatile上的說法是不是簽名的組成部分,根據標準。但有些編譯器會出錯。

例如

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

具有相同的簽名

void f(int, const char*); 
相關問題