数字常量不要直接用,最好用枚举包括起来。
案例 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 声明,这样在排错的时候,一些低级的书写错误将会很容易调试。