C++ 宏字符串拼接 宏定义系统文件路径

基础概念

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;
}

输出结果:
在这里插入图片描述
代码是临时写的,所以比较粗糙,比如存在内存泄露等问题,还请忽略。本文主要也是为了学习一下字符串拼接宏的使用,因此做个记录,内容中如果有错误的地方,还请批评指正!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值