最近在看一个c++各数据类型和 JSON 或 xml 互转的库,重点阅读了其中宏的编写
// 结构体格式如下
struct User{
long uid;
string name;
XPACK(A(uid, "id"), O(name)); //用于指示各变量的特殊操作
}
#define XPACK(...) \
X_PACK_COMMON \
X_PACK_DECODE_BEGIN X_PACK_N(X_PACK_L1, X_PACK_L1_DECODE, __VA_ARGS__) } \
X_PACK_ENCODE_BEGIN X_PACK_N(X_PACK_L1, X_PACK_L1_ENCODE, __VA_ARGS__) }
结构体中的变量数目不定,采用可变参数宏:
...
和__VA_ARGS__
配合使用,...
处填充的内容将填充到___VA_ARGS__
处
__VA_ARGS__
替换最后一个具体参数后所有内容包括逗号等
当然c++并不提倡使用可变参数
#define X_PACK_COMMON \
public: \
static bool const __x_pack_value = true;
#define X_PACK_DECODE_BEGIN \
template<class __X_PACK_DOC, class __X_PACK_ME> \
void __x_pack_decode(__X_PACK_DOC& __x_pack_obj, __X_PACK_ME &__x_pack_self, const xpack::Extend *__x_pack_extp) {(void)__x_pack_extp;
// encode function
#define X_PACK_ENCODE_BEGIN \
template <class __X_PACK_DOC, class __X_PACK_ME> \
void __x_pack_encode(__X_