是否有可能在C中定义依赖于数据类型的函数。我想定义一个函数,它根据1d数组或2d数组作为参数使用不同的过程。功能取决于C中的数据类型
回答
这些天最简单的方法是使用一个宏_Generic
。以下是一个展示如何使用它的例子。
#define cbrt(X) _Generic((X), \
long double: cbrtl, \
default: cbrt, \
float: cbrtf \
)(X)
因此,根据不同的类型,这个宏将本着以cbrtl()
一个,cbrtf()
,或cbrt()
一个电话所取代。
我一直忘记'_Generic',它是完全标准的C99;可能是因为它的恐怖导致记忆细胞死亡。但它非常有用,绝对值得了解。 (虽然也值得指出它不在C++中,并且微软的编译器不会做C99。) – 2015-02-24 19:18:42
@DavidGiven:如果我们编写C++代码,那么这整个讨论是没有意义的。真正的模板存在于C++中。 – 2015-02-24 19:19:32
这是C11而不是C99。 – mfuchs 2015-02-24 19:21:48
函数重载是不可能的C.
你仍然可以实现这样的事情,虽然使用作为概括here变量类型。 虽然它可以很快凌乱。 所以你可能会更好地实施两个功能。
不是(至少不是没有_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()
采用一维数组。
首先,编译器不会允许它。
二,如果我将一个整数传递给函数呢?编译器打印一个警告,但让它发生并将整数转换为一个指针(一维数组),但它无法分辨是将它转换为单个指针(单维数组)还是双指针(二维数组)。
- 1. 功能与数据类型
- 2. scala:mixins取决于参数的类型
- 3. 所有类型参数取决于彼此的功能依赖关系
- 4. Makefile的C/C++与功能取决于环境
- 5. 呼吁取决于类型
- 6. 动态结合功能取决于在C++参数
- 7. 值的范围取决于数据类型的大小?
- 8. 功能的数据类型是SML
- 9. 取决于'If'功能的按钮
- 10. 取决于数据类型的格式输出字符串
- 11. 应用if else条件取决于返回的数据类型
- 12. C#中的依赖类型:使输出类型取决于输入值
- 13. Casting void指针,取决于数据(C++)
- 14. C#相当于C++/CLI数据类型
- 15. 导航到数据类型或功能
- 16. C中的数据类型
- 17. 输入字段格式数据不同 - 取决于输入的数据类型
- 18. 关于C#数据类型的问题
- 19. 上调用A类的方法取决于类型参数的
- 20. 代数数据类型相当于C
- 21. 如何调用vimrc中的函数取决于文件类型
- 22. 对于SSE类型的功能
- 23. 类型的成员变量应取决于构造函数参数的类型
- 24. C#。反序列化到相同的类型取决于属性
- 25. ActiveMQ的传输类型的选择取决于系统类型
- 26. 淘汰赛:观察到的计数值取决于功能
- 27. 返回类型取决于参数的Fortran函数
- 28. 代码取决于构建类型?
- 29. MAX在INT和VARCHAR数据类型的t-SQL中的功能
- 30. 取决于数据点
使用两个功能? – isedev 2015-02-24 19:10:36
特别是,从这个问题[这个答案](http://stackoverflow.com/a/25026358/47453)。 – 2015-02-24 19:12:44