由于在前段时间写了一个关于c/c++的宏的使用的自我总结,但实际在那个简单的总结中,很多内容并没有总结的很完善。作为个人的随笔,我也抛上来自己的写的一个简单的使用宏的代码,欢迎大家挑毛病:
#include <stdio.h>
#define CompareOperatorDefine(T, oper) \
bool operator##oper(const T& rh) \
{ \
return this->value_ oper rh.value_; \
} \
#define CompareOperatorDefine2(T, t, oper) \
bool operator##oper(const t value ) \
{ \
return this->value_ oper value; \
} \
#define SelfOperDefine(T, oper) \
T operator##oper(int) \
{ \
T ref(this->value_); \
oper this->value_; \
return ref; \
} \
#define SelfOperDefine2(T, oper) \
T& operator##oper() \
{ \
oper this->value_; \
return *this; \
} \
#define InterOperDefine(T, t, oper) \
T& operator##oper(t inter) \
{ \
this->value_ oper inter; \
return *this; \
} \
#define TypeDefine(T, t, f) \
class T:public BaseType \
{ \
public: \
T(){}; \
T(t value){ value_ = value; }; \
~T(){} \
\
virtual const char *name() \
{ \
static char name[40]; \
sprintf(name, "%s", #T); \
return name; \
} \
\
virtual const char *toString() \
{ \
static char valuestr[20]; \
sprintf(valuestr, "%%%s", #f); \
sprintf(valuestr, valuestr, value_);\
return valuestr; \
} \
\
SelfOperDefine(T, ++)\
SelfOperDefine(T, --) \
SelfOperDefine2(T, ++) \
SelfOperDefine2(T, --) \
\
InterOperDefine(T, t, +=) \
InterOperDefine(T, t, -=) \
\
CompareOperatorDefine(T, >) \
CompareOperatorDefine(T, <) \
CompareOperatorDefine(T, ==) \
CompareOperatorDefine(T, >=)\
CompareOperatorDefine(T, <=)\
CompareOperatorDefine(T, !=)\
CompareOperatorDefine2(T, t, >)\
CompareOperatorDefine2(T, t, <)\
CompareOperatorDefine2(T, t, ==)\
CompareOperatorDefine2(T, t, >=)\
CompareOperatorDefine2(T, t, <=)\
CompareOperatorDefine2(T, t, !=)\
\
private: \
t value_; \
}; \
class BaseType
{
public:
BaseType(){}
~BaseType(){}
virtual const char *name() { return "BaseType"; }
virtual const char *toString(){ return ""; }
};
TypeDefine(Integer, int, d);
TypeDefine(UInteger, unsigned int, u);
TypeDefine(Character, char, c);
TypeDefine(UCharacter, unsigned char, c);
TypeDefine(Float, float, f);
TypeDefine(Short, short, d);
TypeDefine(Long, long, lld);
TypeDefine(ULong, unsigned long, llu);
TypeDefine(Double, double, g);
#undef CompareOperatorDefine
#undef CompareOperatorDefine2
#undef SelfOperDefine
#undef SelfOperDefine2
#undef InterOperDefine
#undef TypeDefine
在上述代码中,有几处需要说明的地方:
1. #define 是定义宏的关键字
2. #undef 撤销宏定义的关键字
3. A##B 这种表示将A和B以字符串的形式拼接,形成的结果就是AB
4. #A 这种表示将A的参数传入按照其对应的字符串解析,比如#A出来的结果就是“A”