基础概念
C++中通过宏可以对标识符进行拼接或者将标识符转化成字符串,两个#号可以拼接标识符,一个#号可以将标识符转换成字符串。
1、标识符转字符串
#define TOSTR1(_FILENAME_) #_FILENAME_
#define TOSTR2(_FILENAME_,_SUFFIX_) #_FILENAME_"."#_SUFFIX_
int main() {
cout << TOSTR1(cloud) << endl;
cout << TOSTR2(cloud, txt) << endl;
return 0;
}
输出结果:
2、标识符拼接
#define STRCAT1(_IDT1_,_IDT2_) my_##IDT1_##_##_IDT2_
#define STRCAT2(_IDT1_,_IDT2_) my_##_IDT1_##_##_IDT2_
#define TOSTR(_NAME_) #_NAME_" = "
int main() {
int STRCAT1(first, bag) = 0;
int STRCAT2(second, bag) = 1;
cout << TOSTR(my_first_bag) << STRCAT1(first, bag) << endl;
cout << TOSTR(my_second_bag) << STRCAT2(second, bag) << endl;
return 0;
}
输出结果:
一个简单的例子:宏定义系统文件路径
在实际项目中经常需要配置大量的文件路径,因此可以定义一个Path类,利用宏来拼接文件的路径输出。
文件夹层次结构如下:
F:.
├───imm
│ cloud.bin
│ encode.bin
│
└───mut
decode.bin
local.bin
其中,imm为只读文件夹,包含cloud.bin和encode.bin两个文件;mut为读写文件夹,包含decode.bin和local.bin两个文件。
代码如下:
class Path {
public:
Path() {
reset();
set_root();
}
~Path() {}
private:
const char* imm_route;
const char* mut_route;
void reset() {
memset(this, 0, sizeof(Path));
}
void set_root() {
imm_route = "F:/dir/imm/";
mut_route = "F:/dir/mut/";
}
char* internal_strcat(char*& fn, const char* s1, const char* s2) {
if (fn) { return fn; }
Uint32 len1 = strlen(s1);
Uint32 len2 = strlen(s2);
fn = (char*)malloc(len1 + len2 + 1);
memcpy(fn, s1, len1);
memcpy(fn + len1, s2, len2);
fn[len1 + len2] = '\0';
return fn;
}
#define DFP_DEF(_IMM_,_FNAME_,_EXT_) \
public: \
const char *_IMM_##_##_FNAME_(){ \
return internal_strcat(_IMM_##_##_FNAME_##_fn,_IMM_##_route,_str_##_FNAME_##_##_EXT_());\
}\
private:\
char* _IMM_##_##_FNAME_##_fn;\
const char* _str_##_FNAME_##_##_EXT_(){ \
return #_FNAME_"."#_EXT_; \
}\
DFP_DEF(imm, cloud, bin);
DFP_DEF(imm, encode, bin);
DFP_DEF(mut, decode, bin);
DFP_DEF(mut, local, bin);
};
int main() {
Path tmp_path;
cout << tmp_path.imm_cloud() << endl;
cout << tmp_path.imm_encode() << endl;
cout << tmp_path.mut_decode() << endl;
cout << tmp_path.mut_local() << endl;
return 0;
}
输出结果:
代码是临时写的,所以比较粗糙,比如存在内存泄露等问题,还请忽略。本文主要也是为了学习一下字符串拼接宏的使用,因此做个记录,内容中如果有错误的地方,还请批评指正!