cmake取消宏定义_宏的高级用法:XMACRO

本文介绍了如何使用CMake取消宏定义,并通过XMACRO技术优化播放器命令处理的代码,避免冗长的switch-case或if-else结构。通过XMACRO,可以实现编译时的代码生成,提高效率并简化维护。
摘要由CSDN通过智能技术生成
使用switch-case/if-else

对于条件/分支处理的程序设计,我们惯性地会选择switch-case或者if-else,这也是C语言老师当初教的。以下,我们用一个播放器的例子来说明,要实现的功能如下:

  1. 收到用户操作播放器命令请求,如“播放”、“暂停”等,程序要对命令作区分;

  2. 针对不同的命令请求,作相应的处理;

  3. 输出必要的辅助信息。

首先,将命令定义成enum类型:

 enum{
        CMD_PLAY,    CMD_PAUSE,    CMD_STOP,    CMD_PLAY_NEXT,    CMD_PLAY_PREV,};

然后,用switch-case的分支处理:

 switch(cmd){
        case CMD_PLAY:        // handle play command        break;    case CMD_PAUSE:        // handle pause command        break;    case CMD_STOP:        // handle stop command        break;    case CMD_PLAY_NEXT:        // handle play next command        break;    case CMD_PLAY_PREV:        // handle play previous command        break;    default:        break;}

实际上,这也没什么毛病。但是,时间长了,需求不断变更,程序不断迭代,这个switch-case会变得非常冗长而很难维护。你不相信?我曾经见到过>1000行的类似这样的代码。如果让你接手维护这样的代码,你内心会不会狂奔着万千草泥马?

但是,我不敢更改这个祖传的switch-case啊,那么小心翼翼地将这些命令处理封装成函数。像这样:

 #define FUNC_IN()   printf("enter %s \r\n", __FUNCTION__)void func_cmd_play(void* p){
        FUNC_IN();}void func_cmd_pause(void* p){
        FUNC_IN();}void func_cmd_stop(void* p){
        FUNC_IN();}void func_cmd_play_next(void* p){
        FUNC_IN();}void func_cmd_play_prev(void* p){
        FUNC_IN();}void pl
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值