2015-02-24 20 views
2

是否有可能在C中定義依賴於數據類型的函數。我想定義一個函數,它根據1d數組或2d數組作爲參數使用不同的過程。功能取決於C中的數據類型

+0

使用兩個功能? – isedev 2015-02-24 19:10:36

+2

特別是,從這個問題[這個答案](http://stackoverflow.com/a/25026358/47453)。 – 2015-02-24 19:12:44

回答

0

C沒有過載能力,所以在直C中,您將不得不使用2個不同的函數。

如果您願意使用C++,您可以將1D數組定義爲與2D數組不同的數據類型,然後使用重載,從而允許C++編譯器選擇正確的函數,但不能直接使用C.

+1

請參閱http://stackoverflow.com/a/25026358/47453。 C的最新版本現在可以做到這一點。 – amo 2015-02-24 19:14:15

+0

因此,如果您使用最新的C兼容編譯器,那麼不是真正的重載,而是「足夠接近政府工作」?謝謝你的提示。 – StarPilot 2015-02-24 19:17:18

7

這些天最簡單的方法是使用一個宏_Generic。以下是一個展示如何使用它的例子。

#define cbrt(X) _Generic((X), \ 
      long double: cbrtl, \ 
       default: cbrt, \ 
       float: cbrtf \ 
)(X) 

因此,根據不同的類型,這個宏將本着以cbrtl()一個,cbrtf(),或cbrt()一個電話所取代。

+0

我一直忘記'_Generic',它是完全標準的C99;可能是因爲它的恐怖導致記憶細胞死亡。但它非常有用,絕對值得了解。 (雖然也值得指出它不在C++中,並且微軟的編譯器不會做C99。) – 2015-02-24 19:18:42

+0

@DavidGiven:如果我們編寫C++代碼,那麼這整個討論是沒有意義的。真正的模板存在於C++中。 – 2015-02-24 19:19:32

+2

這是C11而不是C99。 – mfuchs 2015-02-24 19:21:48

0

函數重載是不可能的C.

你仍然可以實現這樣的事情,雖然使用作爲概括here變量類型。 雖然它可以很快凌亂。 所以你可能會更好地實施兩個功能。

0

不是(至少不是沒有_Generic shennanigans)。這是爲什麼。

考慮下面的代碼:

int a(int b[][]) { 
    return 0; 
} 

int a(int b[]) { 
    return 0; 
} 

int main (int argc, char *argv[]) 
{ 
    int c = 5; 
    a(c); 
    return 0; 
} 

現在考慮編譯器的輸出(在這種情況下gcc):

a.c:1:11: error: array type has incomplete element type 
int a(int b[][]) { 
     ^
a.c:5:5: error: redefinition of ‘a’ 
int a(int b[]) { 
    ^
a.c:1:5: note: previous definition of ‘a’ was here 
int a(int b[][]) { 
    ^
a.c: In function ‘main’: 
a.c:12:5: warning: passing argument 1 of ‘a’ makes pointer from integer without a cast [enabled by default] 
    a(c); 
    ^
a.c:5:5: note: expected ‘int *’ but argument is of type ‘int’ 
int a(int b[]) { 
    ^

在該示例中,第一a()函數採用一個二維數組(技術上是雙指針),第二個a()採用一維數組。

首先,編譯器不會允許它。

二,如果我將一個整數傳遞給函數呢?編譯器打印一個警告,但讓它發生並將整數轉換爲一個指針(一維數組),但它無法分辨是將它轉換爲單個指針(單維數組)還是雙指針(二維數組)。