主要了解了宏的使用,#、##的用法。
#ifndef _STACK_MAC_
#define _STACK_MAC_
#include "../util/log.h"
/* 创建一个指定类型的栈
*
* @param TYPE 栈的数据类型
* @param NAME 栈的名字(用于区分)
* @param SIZE 栈的最大空间
* */
#define CreateStack(TYPE, NAME, SIZE) \
int NAME##_topElem = -1; \
int NAME##_size = SIZE; \
TYPE NAME##_array[SIZE]; \
/* 判断一个栈是否为满状态
*
* @param NAME 要判断的栈的名字
* @return flag 是否为满(0/1)
* */
#define IsFull(NAME) ({NAME##_size == (NAME##_topElem + 1);}) \
/* 判断一个栈是否为空状态
*
* @param NAME 要判断的栈的名字
* @return flag 是否为空(0/1)
* */
#define IsEmpty(NAME) ({NAME##_topElem == -1;}) \
/* 向指定的栈内压入元素
*
* @param NAME 要压入元素栈的名字
* @prarm ELEM 要压入的元素
* */
#define PushStack(NAME, ELEM) \
do { \
if(IsFull(NAME)) { \
LOG("栈 %s 已满!\n", #NAME) \
break; \
} \
NAME##_topElem++; \
NAME##_array[NAME##_topElem] = ELEM; \
}while(0); \
/* 对指定的栈进行出栈
*
* @param NAME 要出栈的栈的名字
* @prarm e 将栈顶元素保存至e
* */
#define PopStack(NAME, e) \
do { \
if(IsEmpty(NAME)) { \
LOG("栈 %s 已空!\n", #NAME) \
break; \
} \
*e = NAME##_array[NAME##_topElem]; \
NAME##_topElem--; \
}while(0); \
#endif