如何优雅地使用常量?

数字常量不要直接用,最好用枚举包括起来。
案例 1 :表类型
这是我在项目中写的一个给接收的 mac 标记设备类型的函数,重点看 DeviceFlags 枚举的作用。
根据这个枚举,在 switch - case 中就可以写出非常直观好看的代码。

enum DeviceFlags
{
    NOREPLY = 1,  //无回应
    ERROR,        //错误的设备型号
    RIGHT,        //正确的设备型号
};

void markFlag(char *mac, int32_t flag)
{
    char str[12];
    switch (flag)
    {
        case NOREPLY:
            sprintf(str, "noreply");
            break;
        case ERROR:
            sprintf(str, "error");
            break;
        case RIGHT:
            sprintf(str, "right");
            break;
        default:
            LOG_INFO("error input flag !!!");
            break;
    }
    ......
}

案例 2 :表状态
还是上面那个项目,这里是在回调函数中设置网络设备的状态,本来只是两个简单的数字,0、1,但是为了方便理解和减少调试难度,一样也统一了常量的枚举。

enum ConnectFlag
{
    DISCONNECT = 0,		//断开状态
    CONNECT,			//连接状态
};

int32_t NL_CmdConnect(struct nl_msg *msg, void *arg)
{
    if(getConnectFlag() != CONNECT)
        setConnectFlag(CONNECT);	//设置连接状态为连接
    
    return NL_SKIP;
}

int32_t NL_CmdDisconnect(struct nl_msg *msg, void *arg)
{
    if(getConnectFlag() != DISCONNECT)
        setConnectFlag(DISCONNECT);	//设置连接状态为断开
    
    return NL_SKIP;
}```

//客户端线程函数
void *client_proc(void *arg)
{
    ......
    while(1)
    {
        recvfrom(client.cli_sock,buffer,1024,0,(struct sockaddr*)&client.ser_addr,&client.IP_len);
        if(strstr(buffer,ACK) && ignore==0)
            ......
        else if(strstr(buffer,client.hw_addr))
        {
            ignore=1;
        }

        //连接断开则重置NOACK为0
        if(getConnectFlag() == DISCONNECT)	//查看设备是否处于断开状态
            ignore = 0;
    }
}

案例 3 :表命令(来自Linux 内核中 nl802.11协议的头文件)
其实很多实际的项目中,一旦是涉及大量命令的,所谓的命令基本上都是一些简单的数字。但是直接使用大量的数字并不工整,并且要写很多注释说明某个数字代表某个命令。这是个很不好的习惯,建议像下面这个

enum nl80211_commands {
/* don't change the order or add anything between, this is ABI! */
    ......
    NL80211_CMD_GET_BEACON,
    NL80211_CMD_SET_BEACON,
    NL80211_CMD_START_AP,
    NL80211_CMD_NEW_BEACON = NL80211_CMD_START_AP,
    NL80211_CMD_STOP_AP,
    NL80211_CMD_DEL_BEACON = NL80211_CMD_STOP_AP,

    NL80211_CMD_GET_STATION,
    NL80211_CMD_SET_STATION,
    NL80211_CMD_NEW_STATION,
    NL80211_CMD_DEL_STATION,
    NL80211_CMD_SET_BSS,
    NL80211_CMD_GET_MESH_CONFIG,
    NL80211_CMD_SET_MESH_CONFIG,

    NL80211_CMD_SET_MGMT_EXTRA_IE /* reserved; not used */,
    NL80211_CMD_GET_SCAN,
    NL80211_CMD_TRIGGER_SCAN,
    NL80211_CMD_NEW_SCAN_RESULTS,
    NL80211_CMD_SCAN_ABORTED,

    NL80211_CMD_REG_CHANGE,

    NL80211_CMD_AUTHENTICATE,```
    NL80211_CMD_ASSOCIATE,
    NL80211_CMD_DEAUTHENTICATE,
    NL80211_CMD_DISASSOCIATE,

    NL80211_CMD_MICHAEL_MIC_FAILURE,
    NL80211_CMD_REG_BEACON_HINT,

    NL80211_CMD_JOIN_IBSS,
    NL80211_CMD_LEAVE_IBSS,

    NL80211_CMD_TESTMODE,

    NL80211_CMD_CONNECT,
    NL80211_CMD_DISCONNECT,

    ......
    NL80211_CMD_JOIN_MESH,
    NL80211_CMD_LEAVE_MESH,

    NL80211_CMD_UNPROT_DEAUTHENTICATE,
    NL80211_CMD_UNPROT_DISASSOCIATE,

    NL80211_CMD_NEW_PEER_CANDIDATE,
     NL80211_CMD_START_SCHED_SCAN,
    NL80211_CMD_STOP_SCHED_SCAN,
    NL80211_CMD_SCHED_SCAN_RESULTS,
    NL80211_CMD_SCHED_SCAN_STOPPED,

    NL80211_CMD_SET_REKEY_OFFLOAD,

    NL80211_CMD_PMKSA_CANDIDATE,
    NL80211_CMD_START_P2P_DEVICE,
    NL80211_CMD_STOP_P2P_DEVICE,

    NL80211_CMD_SET_MAC_ACL,

    ......
    /* add new commands above here */
    
    /* used to define NL80211_CMD_MAX below */
    __NL80211_CMD_AFTER_LAST,
    NL80211_CMD_MAX = __NL80211_CMD_AFTER_LAST - 1
};

案例 4 :表配置(大多数配置文件的路径)
路径是字符串常量,不建议直接在用到的地方写,最好用 define 声明。

#define JAUTH_ZLOG_CONF "/etc/jauth_log.conf"

dzlog_init(JAUTH_ZLOG_CONF, "jauth")

此外,设计程序时时常会一些即时用到的字符串常量,建议都使用 define 声明,这样在排错的时候,一些低级的书写错误将会很容易调试。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值