从.h开始
被忽视的#define
#define 在学习过程中被诟病没有类型检测,会出现检查不出来的问题,因为只做文本替换不做类型判断,容易出现问题。但是在阅读代码时候,发现#define在简化代码量,增加可读性方面作用很大,能很大程度上简化代码的书写。
在名称上,宏替换的所有指定字串,都使用大写字母+下划线连接符连接,这样在命名规范上保持统一有助于让代码可读性更好。
例如:
(1)对命名空间的简化
#define AMAP_SP_BEGIN namespace amap_sp {
#define AMAP_SP_END }
(2)对嵌套命名空间的简化,传入使用的子空间名称
#define AMAP_SP_BEGIN_NAMESPACE(x) namespace amap_sp { namespace x {
#define AMAP_SP_END_NAMESPCAE(x) } }
(3)对使用命名空间的简化,使用define时候需要注意此部分是简单的文本替换,需要特别注意文本内容,比如分号
#define AMAP_SP_USE_NAMESPACE(x) using namespace amap_sp::x
#define AMAP_SP_USE_SPACEROOT using namespace amap_sp;
(4)对命名空间中的内容进行简化
#define AMAP_SP_NS(x) amap_sp::x
#define NS_STD using namespace std;
(5)对智能指针的简化,define中的双井号代表直接连接两个部分,其中涉及字串的转移,所以需要使用连接符号进行转义
#define AMAP_SP_TYPEDEF_PTR(x) typedef std::shared_ptr<x> x##Ptr
(6)对大字串的简化,例如函数体,使用define可以简化很多同质复写,简化代码量,提高代码可读性。此时的会出现换行保证可读性,但是其本质是一行的,需要用\符号表示换行连接
#define REGISTER_FACTORY(x) \
extern "C"{ \
ModuleFactory* createFactory() { \
return new x(); \
}; \
} \
\
extern "C"{ \
void destroyFactory(ModuleFactory* factory) {\
if (factory != NULL) { \
delete factory; \
} \
}; \
} \
特别的,在使用函数体时候,可以像书写正常函数一样,指定若干形参,后面的代码段中作为参数使用。
#define SP_ERROECODE 505
#define GET_CONTEXT_SHAREDATA(contextname, type, kname, vname) \
type* vname = NULL; \
if (contextname->hasShareDate(kname)) {\
vname = contextname->getShareData<type>(kname);\
if (NULL == vname) {\
contextname->setResult(SP_ERRORCODE, kname " null!");\
return ProcessResult(ProcessResult::CHAIN_EXIT);\
}\
}\
上述代码段中,将一段固定流程的函数写成了模板的格式,使用define直接进行参数替换和字串替换
(7)对常用数据类型的简化,例如常用的string类型的key-value,set,vector,这些数据结构类型表示也可以用define进行简化。
typedef std::map<std::string, std::string> KeyValueMap;
typedef std::set<std::string> StringSet;
typedef std::vector<std::string> StringVect;