explicity 关键字

本文探讨了C++中显式构造函数的使用方法及其目的。通过具体代码示例,解释了如何定义显式构造函数来阻止编译器进行隐式类型转换,这对于避免潜在错误和提高代码安全性至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class CKeyWordExplicityTest
{
public:
 //explicit CKeyWordExplicityTest(int i_i)
 //{

 //}

 CKeyWordExplicityTest(int i_i)
 {

 }
};

int _tmain(int argc, _TCHAR* argv[])
{
 CKeyWordExplicityTest keyWrodExplicityTest=1;
 return 0;
}

explicity 关键字用于构造函数的声明
效果是防止这个构造函数用于隐式构造

static int insert_cus ( struct dhcp_binding *res, /* pointer to lease descriptor */ ULONG lease, /* lease duration, in seconds */ int tagnum, /* tag value of option */ char *inserted, /* bitmap of inserted options */ char flag, /* if ACTIVE, marks non-default options */ DHCP_SERVER_POOL poolParam ) { char *option = NULL; int reqoptlen = 0; char *reqopt = NULL; int i = 0; UINT8 addOption[DHCPS_MAX_OPTION_LEN] = {0}; int ret = 0; //DHCP_SERVER_POOL pool; int j = 0; struct in_addr acAddr; UINT8 hasAcAdrr = 0; //memset(&pool, 0, sizeof(pool)); memset(addOption, 0, sizeof(addOption)); //swDhcpsPoolGet(res->poolName, &pool); //todo getbyname /* insert the requested options */ /* 在报文的option字段中,找到_DHCP_REQ_LIST_TAG 的位置 */ option = (char *)pickup_opt(dhcpsMsgIn.dhcp, priv_rdhcplen, _DHCP_REQ_LIST_TAG); if (option != NULL) { reqopt = OPTBODY (option);/* option的类型 */ reqoptlen = DHCPOPTLEN (option); /* * Handle requested parameters. The PASSIVE flag only inserts options * explicity configured into the resource entry. (Rule 1 of RFC 1541). * Because the implementation used "tblc=dflt" to force inclusion of * any missing parameters defined in the Host Requirements Document, * the PASSIVE flag will also include those settings if not already * present. (Rule 2 of RFC 1541). */ for (i = 0; i < reqoptlen; i++) /* 一共需要reqoptlen个options */ { /* inserted 是一个位图,如果提供了某个options,它就会在该options对应的位上写上'1', 表示系统存在该位 */ char tmpOpt = (*(reqopt + i)); switch(tmpOpt) { case _DHCP_CLASS_ID_TAG: { { DEBUG_DHCPS("class id\r\n"); char classIdStr[DHCPS_MAX_CLASS_ID_STR_LEN+1] = {0}; int idlen = 0; if (ERR_NO_ERROR == rtdDhcpsGetClassId(classIdStr)) { DEBUG_DHCPS("class id %s\r\n", classIdStr); idlen= strlen(classIdStr); if( 0 < idlen&&!ISSET(inserted, _DHCP_CLASS_ID_TAG)) { #if 0 dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_CLASS_ID_TAG; dhcpsMsgOut.dhcp->options[priv_off_options++] = idlen; memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], classIdStr, idlen); priv_off_options += idlen; #endif addOption[0] = _DHCP_CLASS_ID_TAG; addOption[1] = idlen; memcpy(&addOption[2], classIdStr, idlen); ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted,_DHCP_CLASS_ID_TAG); } } } insert_custom(res, lease, tmpOpt, inserted, flag,poolParam); } break; } case _DHCP_WAPCAP_AC_TAG: { #if 0 /* 存在用户指定的option 138字段添加上去 */ { DEBUG_DHCPS("wapcap ip\r\n"); struct in_addr acAddr; if (ERR_NO_ERROR == swDhcpsGetCapwapAcIp(&acAddr)) { acAddr.s_addr = htonl(acAddr.s_addr); DEBUG_DHCPS("wapcap ip %x\r\n", acAddr.s_addr); if( 0 != acAddr.s_addr ) { dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_WAPCAP_AC_TAG; dhcpsMsgOut.dhcp->options[priv_off_options++] = 4; memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], (char*)&acAddr.s_addr, 4); priv_off_options += 4; } } } break; #endif /* 存在用户指定的option 138字段添加上去 */ { DEBUG_DHCPS("wapcap ip\r\n"); if (ERR_NO_ERROR == rtdDhcpsGetCapwapAcIp(&acAddr)) { if( 0 != acAddr.s_addr ) { hasAcAdrr = 1; } } if (hasAcAdrr == 0&&poolParam.controllerIp.s_addr!=0) { acAddr.s_addr=poolParam.controllerIp.s_addr; if( 0 != acAddr.s_addr ) { hasAcAdrr = 1; } } if (hasAcAdrr&&!ISSET(inserted, _DHCP_WAPCAP_AC_TAG)) { acAddr.s_addr = htonl(acAddr.s_addr); DEBUG_DHCPS("wapcap ip %x\r\n", acAddr.s_addr); #if 0 dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_WAPCAP_AC_TAG; dhcpsMsgOut.dhcp->options[priv_off_options++] = 4; memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], (char*)&acAddr.s_addr, 4); priv_off_options += 4; #endif addOption[0] = _DHCP_WAPCAP_AC_TAG; addOption[1] = 4; memcpy(&addOption[2], (char*)&acAddr.s_addr, 4); ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted, _DHCP_WAPCAP_AC_TAG); } } insert_custom(res, lease, tmpOpt, inserted, flag,poolParam); } break; } case _DHCP_DNS_DOMAIN_TAG: { /* insert domain name */ { char domainName[DHCPS_DOMAIN_NAME_LEN + 1]; UINT8 len = 0; if(poolParam.domainName!=NULL) { len=strlen(poolParam.domainName); if(len>0) { snprintf(domainName,DHCPS_DOMAIN_NAME_LEN + 1,"%s",poolParam.domainName); domainName[len]='\0'; } } DEBUG_DHCPS("domain name"); if ( 0 < len && !ISSET(inserted, _DHCP_DNS_DOMAIN_TAG)) { #if 0 dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_DNS_DOMAIN_TAG; dhcpsMsgOut.dhcp->options[priv_off_options++] = len; memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], domainName, len); priv_off_options += len; #endif addOption[0] = _DHCP_DNS_DOMAIN_TAG; addOption[1] = len; memcpy(&addOption[2], domainName, len); ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted, _DHCP_DNS_DOMAIN_TAG); } } insert_custom(res, lease, tmpOpt, inserted, flag,poolParam); } break; } case _DHCP_NBN_SERVER_TAG: { /* insert NetBIOS name server */ { struct in_addr nbnServer[DHCPS_MAX_NBNSERVER_NUM]; UINT8 num = 0; UINT8 cnt = 0; DEBUG_DHCPS("netbios server"); DEBUG_DHCPS("res->ip_addr:%x", (UINT32)res->ip_addr.ip.s_addr); for (cnt = 0; cnt< DHCPS_MAX_NBNSERVER_NUM; cnt++) { if (0 != poolParam.netBiosNameServer[cnt].s_addr) { nbnServer[(num)++].s_addr = poolParam.netBiosNameServer[cnt].s_addr; } } if ( 0 < num&& !ISSET(inserted, _DHCP_NBN_SERVER_TAG) ) { #if 0 dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_NBN_SERVER_TAG; dhcpsMsgOut.dhcp->options[priv_off_options++] = 4 * num; for (cnt = 0; cnt < num; cnt++) { DHCP_PKT_HTONL(nbnServer[cnt].s_addr); memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], (char *)&nbnServer[cnt].s_addr, 4); DHCP_PKT_NTOHL(nbnServer[cnt].s_addr); DEBUG_DHCPS("netbios server:%x", dhcpsMsgOut.dhcp->options[priv_off_options]); DEBUG_DHCPS("netbios server:%x", dhcpsMsgOut.dhcp->options[priv_off_options+1]); DEBUG_DHCPS("netbios server:%x", dhcpsMsgOut.dhcp->options[priv_off_options+2]); DEBUG_DHCPS("netbios server:%x", dhcpsMsgOut.dhcp->options[priv_off_options+3]); priv_off_options += 4; } #endif addOption[0] = _DHCP_NBN_SERVER_TAG; addOption[1] = 4 * num; for (cnt = 0; cnt < num; cnt++) { DHCP_PKT_HTONL(nbnServer[cnt].s_addr); memcpy(&addOption[2+4*cnt], (char *)&nbnServer[cnt].s_addr, 4); } ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted, _DHCP_NBN_SERVER_TAG); } } insert_custom(res, lease, tmpOpt, inserted, flag,poolParam); } break; } case _DHCP_NB_NODETYPE_TAG: { /* insert NetBIOS node type */ { NETBIOS_NODE_TYPE netBiosNodeType; DEBUG_DHCPS("NetBIOS node type"); netBiosNodeType=poolParam.netBiosNodeType; if ( NBN_SERVER_NODE_TYPE_ERR != netBiosNodeType&& !ISSET(inserted, _DHCP_NB_NODETYPE_TAG)) { #if 0 dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_NB_NODETYPE_TAG; dhcpsMsgOut.dhcp->options[priv_off_options++] = 1; dhcpsMsgOut.dhcp->options[priv_off_options++] = netBiosNodeType; #endif addOption[0] = _DHCP_NB_NODETYPE_TAG; addOption[1] = 1; addOption[2] = netBiosNodeType; ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted, _DHCP_NB_NODETYPE_TAG); } } insert_custom(res, lease, tmpOpt, inserted, flag,poolParam); } break; } default: { if (tmpOpt != 0) { for (j=0; j<DHCPS_MAX_OPTION_NUM; j++) { if (tmpOpt == poolParam.option[j].code && !ISSET(inserted, tmpOpt)) { if(_DHCP_SIP_TAG == tmpOpt) { addOption[0] = tmpOpt; addOption[1] = poolParam.option[j].len + 1; if(poolParam.option[j].type==OP_IP) { addOption[2] = 1; struct in_addr tmpAddr; tmpAddr.s_addr=poolParam.option[j].value.ip.s_addr; DHCP_PKT_HTONL(tmpAddr.s_addr); memcpy(&addOption[3], (char *)&tmpAddr.s_addr, 4); } else { addOption[2] = 0; if (OP_HEX == poolParam.option[j].type) { memcpy(&addOption[3], &(poolParam.option[j].value.hex), poolParam.option[j].len); } else { memcpy(&addOption[3], &(poolParam.option[j].value.ascii), poolParam.option[j].len); } } ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted, tmpOpt); } } else if (OP_HEX == poolParam.option[j].type) { memcpy(&addOption[2], &(poolParam.option[j].value.hex), poolParam.option[j].len); } else { addOption[0] = tmpOpt; addOption[1] = poolParam.option[j].len; if(poolParam.option[j].type==OP_IP) { struct in_addr tmpAddr; tmpAddr.s_addr=poolParam.option[j].value.ip.s_addr; DHCP_PKT_HTONL(tmpAddr.s_addr); memcpy(&addOption[2], (char *)&tmpAddr.s_addr, 4); } else { memcpy(&addOption[2], &(poolParam.option[j].value), poolParam.option[j].len); } ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted, tmpOpt); } } } } } break; } } } } /* 在报文的option字段中,找到_DHCP_OPTION82_TAG的位置 */ option = (char *)pickup_opt(dhcpsMsgIn.dhcp, priv_rdhcplen, _DHCP_OPTION82_TAG); if (option != NULL) { #if 0 dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_OPTION82_TAG; dhcpsMsgOut.dhcp->options[priv_off_options++] = DHCPOPTLEN(option); memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], option + 2, DHCPOPTLEN(option)); /* parasoft-suppress PB-34 "hurihui" */ priv_off_options += DHCPOPTLEN(option); #endif addOption[0] = _DHCP_OPTION82_TAG; addOption[1] = DHCPOPTLEN(option); memcpy(&addOption[2], option + 2, DHCPOPTLEN(option)); ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted, _DHCP_OPTION82_TAG); } } return (0); } 将option 120即_DHCP_SIP_TAG中的ascii和hex按照标准格式填入
最新发布
07-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值