标签:++ strncmp through java 调用 习惯 对齐 字符 equals
众所周知,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。
标签:++ strncmp through java 调用 习惯 对齐 字符 equals
原文地址:http://www.cnblogs.com/yinkw/p/7119029.html