文章作者:门外汉
信息来源:邪恶八进制信息安全团队(
www.eviloctal.com)
去年暑假忙啊,一边是C,一边是C++,中间是数据结构,以至于学数构时无意识的将C和C++也混在一块了,例如C++的模板类,那可是好东西啊,多方便,就时常想着C为什么就不弄个template,呵呵.
在struct里面整个typedef 换类型,换来换去的,太不好了,于是乎,我就做了下面的东东.
就是这么简单,它就是C里面的预处理器运算符##.
引自<<TCPL>>里面的话:预处理器运算符##为宏扩展提供了一种连接实际参数的手段.如果替换文本中的参数与##相邻,则该参数将被实际参数替换......
替换~template很大一部分做的工作不也就是替换么.
复制内容到剪贴板
代码:
#define foo(name) bar##name如此调用foo(a)时,则宏扩展为bara
上面一段似乎没说明什么问题,那么就看下面这段吧:
复制内容到剪贴板
代码:
#ifndef STACK_H
#define STACK_H
#ifndef MY_BOOL
#define MY_BOOL
#define TRUE 1
#define FALSE 0
typedef int BOOL;
#endif
/*栈类型栈结点结构*/
#define DEFINE_STACK_NODE(type,name) \
typedef struct name##STACK_NODE{\
type data;\
struct name##STACK_NODE *prior;\
}name##STACK_NODE;
/*泛类型栈定义*/
#define DEFINE_STACK(type,name) \
DEFINE_STACK_NODE(type,name)\
struct name##STACK{\
int size;\
struct name##STACK_NODE *base;\
struct name##STACK_NODE *top;\
}name##STACK
#define INIT_STACK(name)\
do{\
name##STACK.base=name##STACK.top=(void *)0;\
name##STACK.size=0;\
}while(0)
/*********** 不破坏栈顶元素取值*************************/
#define GET_STACK(name,elem) do{\
if(name##STACK.size){\
*elem=name##STACK.top->data;\
}\
}while(0)
/************** 压入元素elem **************************/
#define PUSH_STACK(name,elem) do{\
name##STACK_NODE *temp=(name##STACK_NODE *)malloc(sizeof(name##STACK_NODE));\
temp->data=elem;\
++(name##STACK.size);\
if(1!=name##STACK.size){\
temp->prior=name##STACK.top;\
name##STACK.top=temp;\
}\
else{\
temp->prior=(void *)0;\
name##STACK.top=name##STACK.base=temp;\
}\
}while(0)
/********** 栈顶元素赋值给elem,并弹出 ***********/
#define POP_STACK(name,elem) do{\
name##STACK_NODE *temp=name##STACK.top;\
if(name##STACK.size){\
*elem =name##STACK.top->data;\
if(1!=name##STACK.size--){\
name##STACK.top =temp->prior;\
}\
else{\
name##STACK.top=name##STACK.base=(void *)0;\
}\
free(temp);\
}\
}while(0)
/************** 清空栈 ************************/
#define CLEAR_STACK(name) do{\
for(;name##STACK.size;--name##STACK.size){\
name##STACK_NODE *temp=name##STACK.top;\
name##STACK.top=name##STACK.top->prior;\
free(temp);\
}\
name##STACK.base=name##STACK.top=(void *)0;\
}while(0)
/****************栈空???? ************************/
#define EMPTY_STACK(name) (!name##STACK.size)?(TRUE):(FALSE)
/*****************长度 ************************/
#define LENGTH_STACK(name) (1?name##STACK.size:0)
#endif文件保存为:my_stack.h
再接着一段测试的代码:
复制内容到剪贴板
代码:
#include <stdio.h>
#include "my_stack.h"
DEFINE_STACK(int,A);
int main(void)
{
DEFINE_STACK(double,B);
int a;
double b;
INIT_STACK(A);
INIT_STACK(B);
printf("%d ",LENGTH_STACK(A));
for(a=1;a<=100;a++){
PUSH_STACK(A,a);
PUSH_STACK(A,a);
PUSH_STACK(A,a);
}
printf("%d ",LENGTH_STACK(A));
for(a=1;a<=100;a++){
PUSH_STACK(B,(double)a);
}
while( ! EMPTY_STACK(A)){
POP_STACK(A,&a);
if( ! EMPTY_STACK(B)){
POP_STACK(B,&b);
}
}
CLEAR_STACK(A);
CLEAR_STACK(B);
return 0;
}大家是不是觉得我很无聊呢?嘿嘿 [s:45]
就算是脑筋急转弯吧.HOHO~
最后:老大们,我好仰慕你们哇,我想加入哇,这是我的投名状..小弟拜呈.
88大家.