Ask*_*ath 9 c types generic-programming
我想编写泛型函数(例如,获取'void**'类型的数组并对此数组做一些事情的函数),这样这个函数将得到元素的类型(在示例中,它将是类型数组中的任何元素)作为参数.
我可以用c做吗?
例如:
我想编写一个获取数组(类型为void**)的函数,并以某种随机方式初始化此数组.
什么是"以某种随机方式"的含义 - 例如作为参数获取的函数:array(在类型void**中),数组中任何元素的类型,index(在int的类型中)并初始化此单元格.
Lun*_*din 12
只有拥有标准C编译器才能_Generic实现此目的,在这种情况下,您可以将关键字用于此目的.您必须为每种支持的类型编写不同的函数.
#include <stdio.h>
#define func(x) _Generic((x), int: func_int, char: func_char)(x);
void func_int (int x)
{
printf("%s\t%d\n", __func__, x);
}
void func_char (char x)
{
printf("%s\t%c\n", __func__, x);
}
int main(void)
{
int i = 5;
char c = 'A';
func(i);
func(c);
}
Run Code Online (Sandbox Code Playgroud)
输出:
func_int 5
func_char A
Run Code Online (Sandbox Code Playgroud)
你没有传递"类型".C没有内置的方法来在运行时编码和解码类型信息.对对象进行操作的函数必须静态地知道类型.如果您绝对打算使用指针void,则必须委托知道类型信息的函数.这可以通过回调来完成.例如,标准库函数qsort接受回调以比较对象的值:
void qsort( void *ptr, size_t count, size_t size,
int (*comp)(const void *, const void *) );
Run Code Online (Sandbox Code Playgroud)
调用代码提供回调,并且在所述回调内部它将回送到它需要比较的静态类型.这是一个怎样通常为指针的作品void,一个定义了一组操作,它需要以抽象形式的类型做,然后要求调用代码提供了实施这些操作.
这是一些宏技巧的示例。
函数文件
#ifndef FUNC_H
#define FUNC_H
#define add(a, b, typename) functionAdd##typename(a,b)
/* function declarations */
#define declared(typename) \
typename functionAdd##typename(typename, typename)
declared(int);
declared(float);
#endif
Run Code Online (Sandbox Code Playgroud)
功能文件
#include "func.h"
/* function code */
#define functionAdd(a, b, typename) \
typename functionAdd##typename(typename a, typename b){ \
return a+b; \
}
/* function bodies (definitions) */
functionAdd(a, b, int)
functionAdd(a, b, float)
Run Code Online (Sandbox Code Playgroud)
主文件
#include <stdio.h>
#include "func.h"
int main()
{
int x1 = add(1, 2, int);
float x2 = add(3.0, 4.0, float);
printf("%d %f\n", x1, x2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1124 次 |
| 最近记录: |