最近遇到的问题

注意使用的编译器的版本,进行相应的修改。
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;


3.提供给外部使用的接口函数中,涉及到string类型的,最好是换成const char *;
在最近的代码开发中,使用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

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值