首页 > 代码库 > java程序员使用c++注意事项

java程序员使用c++注意事项

众所周知,java的语法和c++很相似,java程序员如果只是写一写c++的逻辑处理,语法上不会有太大障碍,然而java程序员的编程习惯与正统c++程序员还是有差异的,这些编程习惯的差异可能引入低级bug。以下试图简要说明。

1. c++程序员注重资源的使用和释放,不过大多数java程序员不会犯这类错误。

2. c++程序员讲究精确。

可能是有些数据类型没有默认的初始值,不论什么结构体,c++程序员都喜欢声明的时候紧接着memset一番。

此外c++程序员特别喜欢比对大小端、设定结构体编译的时候对不对齐,这些习惯在我看来又鸡婆又极客。

2. c++程序员关注越界问题。

例如,字符串比较的时候,c++程序员喜欢用strncmp(),而不是strcmp()。同样的还有strncpy替代strcpy。

例如,用char a[1024]存放rpc返回值。如果一段rpc调用的返回值长度可能超过1024,那么这段代码是有bug的。

由于java程序员没有形成对越界问题的警惕习惯,当逻辑比较复杂的时候,java程序员就可能犯错误了。

3. c++程序员很小心赋值语句。

//...
int iRet;

string a,b;

functionA(&a)

parse(a,&iRet);

if(a == 10086)

    //...

functionB(b,&iRet)//这里有问题

if(a != 0)

    throw...
//...

 

c++程序员不会像上文代码一样,用iRet来存放funcionB的返回值。functionB如果没有走到修改iRet的分支,那么iRet不是0而是上面functionA的处理结果,这类错误在系统上线后不好排查。

 

4. c++程序员关注指针和地址的差异。

query(mysql * conn, const string &sql)
{
    if(0 != mysql_real_query(conn, sql, len))
    {
        int status = mysql_errno(conn);
        //是否需要重连
        if(status == CR_SERVER_GONE_ERROR || status == CR_SERVER_LOST)
        {
            conn = getConn();//getConn函数生成新连接,然而这里有问题
            if(0 != mysql_real_query(conn, sql, len)
                return false;
        }
        else
        {
            return false;
        }
    }
}

上面那段函数,因为参数conn是指针,所以conn = getConn()并未成功替换conn的值,这个赋值语句的作用范围仅限于query函数。第二次执行query()时使用的依然是原来的MYSQL对象,读查询结果时程序会抛2014错误。

可以将conn = getConn()替换为mysql_real_connect(conn,host,user. pwd,...)

5. 字符串比较,这是我最崩溃的地方 T T

两个char[]比较:

    (a == b) 比较地址

    strncpy(a, b, sizeof(a)) == 0比较值

 两个string比较:

    a == b,比较地址

    a.compare(b) == 0, 类似java  a.equals(b),比较值

    strncpy(a.c_str(), b.c_strs(), len),c++程序员使用的一种比较蛇精病的写法     

6. c++程序员特别喜欢用4个空格表示tab。

 

java程序员使用c++注意事项