功能取决于C中的数据类型

时间:2015-02-24 19:07:29

标签: c

是否有可能在C中定义依赖于数据类型的函数。我想定义一个函数,它使用不同的过程,取决于1d数组或2d数组作为参数。

4 个答案:

答案 0 :(得分:7)

这些天最简单的方法是使用带有_Generic的宏。这是一个展示如何使用它的例子。

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

因此,根据类型,此宏将替换为对cbrtl()cbrtf()cbrt()之一的调用。

答案 1 :(得分:0)

C没有过载能力,所以在C语言中,你必须使用2种不同的功能。

如果您愿意使用C ++,您可以将1D数组定义为与2D数组不同的数据类型,然后使用重载,允许C ++编译器选择正确的函数,但不能直接使用C. / p>

答案 2 :(得分:0)

C中无法进行功能重载。

尽管使用了here概述的变体类型,您仍然可以实现类似的功能。 它虽然快速变得凌乱。 因此,通过实现两个功能可能会更好。

答案 3 :(得分: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()采用一维数组。

首先,编译器不允许它。

其次,如果我将一个整数传递给函数怎么办?编译器打印一个警告,但允许它发生并将整数转换为指针(一维数组),但它不能告诉是否将其转换为单个指针(单维数组)或双指针(二维数组)。