2015-02-24 57 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()采用一维数组。

首先,编译器不会允许它。

二,如果我将一个整数传递给函数呢?编译器打印一个警告,但让它发生并将整数转换为一个指针(一维数组),但它无法分辨是将它转换为单个指针(单维数组)还是双指针(二维数组)。