每次项目当要用到堆栈时要么会重新写个要么把以前的拷贝过来换个类型,一直在想能不能用C语言做个通用的数据结构库,像C++中的STL一样。要在C语言突破类型的限制以我目前的知识水平能想到的用宏了,后来查到了#define中##的用法。后来就产生了下面这段代码:
#define __p_start do{ #define __p_end }while(0); #define p_stack(_s, _t, _n) typedef _t type_##_s; \ type_##_s _buf_##_s[_n]; \ int _max_##_s = _n-1; \ int _top_##_s = -1 #define p_empty(_s) (_top_##_s < 0) #define p_full(_s) (_top_##_s >= _max_##_s) #define p_push(_s, _x) (!p_full(_s) ? (_buf_##_s[++(_top_##_s)]= _x, 1) : 0) #define p_pop(_s) (!p_empty(_s) ? ((_top_##_s)--, 1) : 0) #define p_top(_s) (!p_empty(_s) ? _buf_##_s[_top_##_s] : (type_##_s)0)
由于C语言中的变量需要在首部声明(文件,函数,代码块首部),所以用花括号解决了任意处申明的问题,但p_stack宏必须紧跟在_p_start宏后,而且每个_p_start宏必须有个对应的_p_end宏。具体用法如下:__p_start p_stack(s1, int, 16); for(i = 0; i < 16; i++) p_push(s1, i+1); __p_start p_stack(s2, float, 16); for(i = 0; i < 16; i++) p_push(s2, (float)i*i / 2.0f); for(i = 0; i < 16; i++) printf("s1[%d]=%d, s2[%d]=%f\n", i, p_top(s1), i, p_top(s2)); __p_end __p_end
后来考虑到__p_start不能带;号与C语言语法有点冲突,改进如下: