是否有可能在C中定义依赖于数据类型的函数。我想定义一个函数,它使用不同的过程,取决于1d数组或2d数组作为参数。
答案 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()
采用一维数组。
首先,编译器不允许它。
其次,如果我将一个整数传递给函数怎么办?编译器打印一个警告,但允许它发生并将整数转换为指针(一维数组),但它不能告诉是否将其转换为单个指针(单维数组)或双指针(二维数组)。