2011-08-25 66 views
2

使用stdarg.h我們可以使用可變數量的參數進行函數調用。這也被歸類爲函數重載?傳遞可變數量的參數特徵 - 函數重載?

+4

這個分類對你有什麼好處? – cnicutar

+1

我認爲這純粹是「超載」意味着什麼的問題。我個人不會稱這種重載,但它**可能**實現一個醜陋的版本在C中使用預處理器與可變宏和可怕的黑客來測試參數的類型... –

回答

2

通常情況下,函數重載意味着根據給定的參數調用函數/方法的不同實例。使用C中的可變參數,不管參數列表如何,都會調用相同的函數。基於此,答案將是「否」。函數本身當然可以模仿重載的行爲(如果是1個參數,那麼做A,如果是2個參數,則做B),但它通常不會被稱爲「重載」。

1

真的,答案可能是「是」或「否」,具體取決於您對「函數重載」的定義。

從編譯器的角度來看,只有一個函數被實例化。從用戶的持續性來看,你可能會調用這個「重載」,但它不是由語言或編譯器來強制執行的。

1

如果您指的是實現,編譯器不會創建重載。變量參數函數使用va_start/va_arg/va_end來獲取它們的參數。

0

答案是直的,因爲C沒有按原樣實現函數重載。它可能允許你改變一個或兩個參數,但是內部發生的並不是函數重載的實際機制。

當一個重載的函數被調用時,C++編譯器通過檢查在該呼叫的 參數的數量,類型和順序選擇 正常功能。函數重載通常用於創建幾個執行類似任務但具有不同數據類型的名稱相同的函數。

我真的不明白你的問題,但在一般的函數重載取決於參數的差異。

該方法的參數。

公衆詮釋加載(INT A,INT B)

公共浮添加(浮起,浮子B)

這是函數重載。至少有一個參數必須改變才能重載該函數。這在c的早期版本中是不可能的,因爲它們不會通過傳遞參數的類型來識別函數。

+0

沒有太多的答案國際海事組織(「C不支持函數重載」),但要指出的是,通常函數的返回不計算;) – cnicutar

+0

好的,我可以重新說明C沒有實際實現函數重載概念的方式,它應該是 – swordfish

0

不,這不是函數重載的例子。

真正的重載意味着你有幾個不同的函數具有相同的名稱,但通過它們的參數列表進行區分。根據您傳遞的參數,將調用不同的函數實例。

0

Overloading表示有多個合同綁定到同一個名稱。 例如:

int a(int i1, int i2); 
int a(char c); 
int a(); 

這不會在存在C作爲符號必須是相同的範圍內是唯一的,但該存在於C++。

因此,即使它可以被稱爲幾種方法,使用不同的參數類型和數量,該
功能int a(int i, ...);不能被看作是用C超載因爲只有一個合同,這是「給我想要的參數和我會找到一種方法來處理它們「。

但是該功能可以在這樣的情況下被視爲在C++中重載:

int a(int i, ...); 
int a(); 
1

重載意味着不同的功能將被調用取決於數量和/或類型(s)的參數(一些語言也可以使用返回類型)。但在這種情況下,無論參數的數量多少,您都可以調用相同的函數。

這比func(42)func(43)沒有更多的超載。

請注意,C99的確有一些的行爲很像超載的狹義形式。如果您有#include <tgmath.h>,則sqrt(x)將調用三種不同功能(sqrtf(),sqrt()sqrtl())中的一種,具體取決於x的類型。但這實際上是一個「類型通用宏」「,而不是一個重載函數。 C11添加了_Generic關鍵字,使該設施可供用戶編寫的代碼使用。但這與OP的問題無關。

相關問題