1.常用的宏定义
#define SAFE_DELETE(x) {if(x != NULL) {delete x; x = NULL;}}
#define SAFE_DELETE_V(x) {if(x != NULL) {delete[] x; x= NULL;}}
2.错误码定义
在sdk开发过程中,通过需要大量的错误码,有业务上的,也有一些协议中的,如HTTP中404这种类型的,
最好是使用枚举类型进行统一定制。
typedef enum {
Err_OK = 200,
...
}ErrCode_Number;
在最近的代码开发中,使用string类型作为形参,作为提供给外部使用的函数,总是会出现
莫名其妙的问题,后来定位发现是由于string版本的不同导致的,有很多坑,最好是使用char*,内部
函数可以使用Std::string &desc。
4.//根据指定字符分割字符串(忽略空字符串)
std::vector<std::string> splitString(const std::string &src, const std::string &delimit)
{
std::vector<std::string> v;
if (src.empty() || delimit.empty())
{
return v;
}
size_t delimitLen = delimit.size();
size_t index = std::string::npos;
size_t lastPosition = 0;
while ((index = src.find(delimit, lastPosition)) != std::string::npos)
{
if (index != lastPosition)
{
//过滤掉空字符串
v.push_back(src.substr(lastPosition, index-lastPosition));
}
lastPosition = index + delimitLen;
}
v.push_back(src.substr(lastPosition, src.size() - lastPosition));
return v;
}
5.IP地址转换
static std::string IPv4ToIPv6(std::string IPv4 ,sockaddr_in6* IPv6Sockaddr)
{
if ( NULL == IPv6Sockaddr) {
return "";
}
/* 获取IPv4地址信息 */
addrinfo hint, *IPv4AddrInfo = NULL;
memset(&hint, 0, sizeof(hint));
hint.ai_family = AF_INET;
hint.ai_socktype = SOCK_STREAM;
#if (!defined __android__) && (!defined WIN32)
hints.ai_flags = AI_DEFAULT;
#endif
int error = getaddrinfo(IPv4.c_str(), NULL, &hint, &IPv4AddrInfo);
if (error != 0) {
freeaddrinfo(IPv4AddrInfo);
IPv4AddrInfo = NULL;
ERRORF(LOG_TAG_MANAGER, "IPv4ToIPv6>getaddrinfo failed[%s]\n", gai_strerror(error));
return "";
}
/* 用IPv4地址的4个字节替换IPv6地址后4个字节 */
sockaddr_in *IPv4_in = (sockaddr_in*)IPv4AddrInfo->ai_addr;
sockaddr_in6 *IPv6_in6 = (sockaddr_in6*)IPv6Sockaddr;
for (int i = 0; i < sizeof(in_addr); ++i) {
((char*)(&IPv6_in6->sin6_addr))[i+12] = ((char*)(&IPv4_in->sin_addr))[i];
}
freeaddrinfo(IPv4AddrInfo);
IPv4AddrInfo = NULL;
/* IPv6地址格式化为字符串形式 */
char hostName[1024] = {0};
error = getnameinfo((sockaddr*)IPv6Sockaddr, sizeof(sockaddr_in6), hostName, sizeof(hostName), NULL, 0, NI_NUMERICSERV | NI_NUMERICHOST);
if (error != 0) {
ERRORF(LOG_TAG_MANAGER, "IPv4ToIPv6>getnameinfo failed[%s]\n", gai_strerror(error));
return "";
}
return std::string(hostName);
}
6.检查IPV6地址是否有效
static std::string checkIpInfo(std::string strAddress, bool* IS_IPV6, sockaddr_in6* IPv6Sockaddr)
{
struct addrinfo *result = NULL;
struct addrinfo *res = NULL;
struct addrinfo hints;
char ipv4[128] = {0};
char ipv6[128] = {0};
int error = 0;
*IS_IPV6 = false;
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
#if (!defined __android__) && (!defined WIN32)
hints.ai_flags = AI_DEFAULT;
#endif
error = getaddrinfo(strAddress.c_str(), NULL, &hints, &result);
int iRet = EAI_FAIL;
if(error != 0)
{
ERRORF(LOG_TAG_MANAGER, "%s getaddrinfo failed!\r\n", strAddress.c_str());
return "";
}
for(res = result; res != NULL; res = res->ai_next)
{
char hostname[1025] = {0};
char tmpport[10] = {0};
error = getnameinfo(res->ai_addr, res->ai_addrlen, hostname, 1025, tmpport, sizeof(tmpport), NI_NUMERICSERV | NI_NUMERICHOST);
if(error != 0)
{
continue;
}
else
{
switch (res->ai_addr->sa_family)
{
case AF_INET:
memcpy(ipv4, hostname, 128);
break;
case AF_INET6:
memcpy(ipv6, hostname, 128);
if(NULL != IPv6Sockaddr)
{
memcpy(IPv6Sockaddr, res->ai_addr, sizeof(sockaddr_in6));
}
*IS_IPV6 = true;
default:
break;
}
}
}
freeaddrinfo(result);
#if (defined __android__) || (defined WIN32)
*IS_IPV6 = false;
#endif
ERRORF(LOG_TAG_MANAGER, "%s checkIpInfo success! IPv4Address:%s, IPv6Address:%s\r\n", strAddress.c_str(), ipv4, ipv6);
return (*IS_IPV6 ? ipv6 : ipv4);
}
8.svn提交代码出现 pre-commit(hook),说明提交代码需要按照相应的格式才能提交代码。
9. int /long 转const char*
long recordType;
char szRecordType[32]={0};
sprintf_s(szRecordType,32,"%d",recordType);
char* int2Str(unsigned int intValues) { int len = 0; unsigned int tmpValue = intValues; //计算输入整数的长度 while (tmpValue) { len++; tmpValue /= 10; } //分配指定字节的内存空间 char* str = (char*)malloc((len+1)*sizeof(char));//最后一位存放结束符'\0' memset(str, 0, len + 1);//初始化为0 int i = 1; //一个个存入str中 while (intValues) { //每次取到的是数字的最末位,所以str从后往前存储 str[len - i] = intValues % 10 + '0'; intValues /= 10; i++; } str[len] = '\0';//末尾加上结束符 return str; }
10.C++ new失败的处理
int* p = new (std::nothrow) int; // 这样如果 new 失败了,就不会抛出异常,而是返回空指针
if ( p == 0 ) // 如此这般,这个判断就有意义了
return -1;
// 其它代码
11.
template<class T>
void to_string(string & result,const T& t)
{
ostringstream oss;//创建一个流
oss<<t;//把值传递如流中
result=oss.str();//获取转换后的字符转并将其写入result
}