设为首页 加入收藏

TOP

C与泛型 (一)
2014-11-23 23:39:57 来源: 作者: 【 】 浏览:42
Tags:

【问题描述】泛型是一种特殊的类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。泛型旨在解决函数名字冲突的问题。一般认为泛型是高级语言的能力,泛型的实现一般借助高级语言的模板概念。C语言是否能实现泛型呢?答案是能,不过比高级语言困难得多。下面总结两种泛型的实现方法。

【解析】

编译环境:

Fedora 10, gcc版本gcc4.3.2

1 利用函数指针实现泛型

【代码清单】

printtest.c

[html]
#include
#include

#define DEBUG 0

#define PRINTSTAT( FORMAT, STAT) \
printf("**************** " FORMAT " Test ****************\n"\
,STAT);

#define DEBUG_PRINT(FORMAT, VALUE) printf("File %s line %d: "\
#VALUE " = " FORMAT "\n"\
,__FILE__, __LINE__,VALUE\
);

enum {
RET_OK,
RET_FAIL
};

typedef int (*FXPrintFun)(void *data);

int print(FXPrintFun _print, void *data)
{
return _print(data);
}

static int print_int(void *data)
{
printf("%d", (int)data);

return RET_OK;
}

static int print_int2(void *data)
{
printf("%d", *(int*)data);

return RET_OK;
}

static int print_float(void *data)
{
printf("%f", *(float*)data);

return RET_OK;
}

static int print_str(void *data)
{
printf("%s", (char*)data);

return RET_OK;
}

int main(void)
{
int i = 0;
float f = 2.6;
char *test = "Generics test!";

int *pi = &i;
float *pf = &f;

#if DEBUG
DEBUG_PRINT("%f", f)
#endif

PRINTSTAT( "%s", "Integer")
for(; i<10; i++)
print(print_int, (void *)i);
printf("\n");

PRINTSTAT( "%s", "Integer")
for(i = 0; i<10; i++)
print(print_int2, (void *)pi);
printf("\n");

PRINTSTAT( "%s", "Float")
print(print_float, (void *)pf);
printf("\n");

PRINTSTAT( "%s", "String")
print(print_str, (void *)test);
printf("\n");

return RET_OK;
}

#include
#include

#define DEBUG 0

#define PRINTSTAT( FORMAT, STAT) \
printf("**************** " FORMAT " Test ****************\n"\
,STAT);

#define DEBUG_PRINT(FORMAT, VALUE) printf("File %s line %d: "\
#VALUE " = " FORMAT "\n"\
,__FILE__, __LINE__,VALUE\
);

enum {
RET_OK,
RET_FAIL
};

typedef int (*FXPrintFun)(void *data);

int print(FXPrintFun _print, void *data)
{
return _print(data);
}

static int print_int(void *data)
{
printf("%d", (int)data);

return RET_OK;
}

static int print_int2(void *data)
{
printf("%d", *(int*)data);

return RET_OK;
}

static int print_float(void *data)
{
printf("%f", *(float*)data);

return RET_OK;
}

static int print_str(void *data)
{
printf("%s", (char*)data);

return RET_OK;
}

int main(void)
{
int i = 0;
float f = 2.6;
char *test = "Generics test!";

int *pi = &i;
float *pf = &f;

#if DEBUG
DEBUG_PRINT("%f", f)
#endif

PRINTSTAT( "%s", "Integer")
for(; i<10; i++)
print(print_int, (void *)i);
printf("\n");

PRINTSTAT( "%s", "Integer")
for(i = 0; i<10; i++)
print(print_int2, (void *)pi);
printf("\n");

PRINTSTAT( "%s", "Float")
print(print_float, (void *)pf);
printf("\n");

PRINTSTAT( "%s", "String")
print(print_str, (void *)test);
printf("\n");

return RET_OK;
}
Makefile

[html]
OBJS = printtest.o
TARGET = printtest
SRC = printtest.c

all:$(OBJS)
gcc -g $(OBJS) -o $(TARGET)
$(OBJS):printtest.s
gcc -g -c printtest.s -o $(OBJS)
printtest.s:printtest.i
gcc -g -S printtest.i -o printtest.s
printtest.i:$(SRC)
gcc -g -E $(SRC) -o printtest.i
clean:
rm *~ *.o *.s *.i $(TARGET)

OBJS = printtest.o
TARGET = printtest
SRC = printtest.c

all:$(OBJS)
gcc -g $(OBJS) -o $(TARGET)
$(OBJS):printtest.s
gcc -g -c printtest.s -o $(OBJS)
printtest.s:printtes

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇将e插入到顺序表的适当位置上以保.. 下一篇C语言批量下载文件(含源码)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: