泛型:泛型是编写一组函数,但是数据的类型暂时可以不确定的能力。这组函数随后用用户需要的不同类型进行实例化或创建。
C语言并没有提供这种能力,泛型思想被提出的时间的比C语言的设计晚很多,但是我们可以用define模拟这种机制。
下面是一个用静态数组实现的泛型堆栈,数组的长度当堆栈实例化时作为参数提出
#include <assert.h>
//定义一个宏,其中SUFFIX是不同类型时函数的后缀
#define GENERIC_STACK( STACK_TYPE, SUFFIX, STACK_SIZE ) \
static STACK_TYPE stack##SUFFIX[STACK_SIZE] \
static int top_element##SUFFIX = -1 \
int is_empty##SUFFIX( void ) \
{ \
return top_element##SUFFIX == -1; \
} \
int is_full##SUFFIX( void ) \
{ \
return top_element##SUFFIX == STACK_SIZE-1; \
} \
void push##SUFFIX( STACK_TYPE value) \
{ \
assert( !is_full##SUFFIX() ); \
top_element##SUFFIX += 1; \
stack##SUFFIX[ top_element##SUFFIX ] =value; \
} \
void pop##SUFFIX( void ) \
{ \
assert( !is_empty##SUFFIX() ); \
top_element##SUFFIX -=1; \
} \
STACK_TYPE top##SUFFIX( void ) \
{ \
assert( !is_empty##SUFFIX() ); \
return stack##SUFFIX[element##SUFFIX]; \
} \
通过这个宏来使用泛型的堆栈
#include <stdio.h>
#include <stdlib.h>
#include "g_stack.h"
//创建两个堆栈,一个装整数,一个装浮点数
GENERIC_STACK( int, _int ,10 )
GENERIC_STACK( float , _float , 10)
int main()
{
push_int(3);
push_float(3.5);
top_int();
top_float();
pop_int();
pop_flota();
return EXIT_SUCCESS;
}
C语言实现泛型很困难,主要还是用define定义宏来实现的。