关于0bug中一处读者质疑的回复

嗯,豆瓣网某人对我的书《0bug-C/C++商用工程之道》予以***,本来不想回复。
只是最近,一位在大学做教授的朋友,看了书也有一些质疑,我就挑选其中一个比较有代表性的问题做了个解释。后来想想,还是粘贴出来,请大家也都看看。
陈老师好:
 
嗯,我想了一下,为了避免您有所误解,我这里回答一个某人指出我书中的明显bug,来说明为什么不是bug,请您看看。
 
下文是豆瓣网原文摘录,网址在这里: http://www.douban.com/review/2971127/
 
Code:
  1.   P. 188 在 函式 dbg_bin_ascii(char* pPrintBuffer, char* pBuffer, int nLength) 裡    
  2.       
  3.   nCount += SafePrintf(pPrintBuffer+nCount, 256, "%c", *(pBuffer + i));    
  4.       
  5.   這裡的nCount 是目前已寫入的字元數,所以 256 應改為 256 - nCount,並要防止之溢出。P.189 有 5 個相同錯誤。    
  6.   另外,256 是一個 literal,建議改用變量、宏或 const。    
应该说,从程序设计的角度,他说的对,这里面的256不做减法,就是bug,因为可能崩掉。这个可以说是他为本书挑刺,找到的一处算是“铁证”的证明了。
 
不过,我这个原作者说,这不是bug,是优化。原因很简单,他在断章取义。
 
这段代码我的原意是以二进制格式打印一段数据,每行打印成如下格式:
 //打印一行,16Byte
//0000 - 00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00 xxxxxxxxxxxxxxxx
 
函数原型如下,其中,dbg_bin_ascii是打印后面的ASCII表示的数据内容的函数(即红字部分)。请注意,这是静态函数,即仅本模块调用。即仅有dbg_bin这个函数调用。
 
Code:
  1. static int dbg_bin_ascii(char* pPrintBuffer,char* pBuffer,int nLength)   
  2. {   
  3.  int i;   
  4.  int nCount=0;   
  5.  for(i=0;i<nLength;i++)   
  6.  {   
  7.   if(32<=*(pBuffer+i))   
  8.   {   
  9.    //可显示   
  10.    nCount+=SafePrintf(pPrintBuffer+nCount,256,"%c",*(pBuffer+i));   
  11.   }   
  12.   else  
  13.   {   
  14.    //不可显示   
  15.    nCount+=SafePrintf(pPrintBuffer+nCount,256,".");   
  16.   }   
  17.  }   
  18.   
  19.  return nCount;   
  20. }   
  21. static int dbg_bin_hex(char* pPrintBuffer,char* pBuffer,int nLength)   
  22. {   
  23.     //...   
  24. }   
  25. void dbg_bin(char* pBuffer,int nLength)   
  26. {   
  27.     //...   
  28. }   

如您所见,我每行预设打印16Bytes,即dbg_bin_ascii一行,从业务上就界定最多打印16个字符,而如您所见,我预设256的buffer,这是一种常见的手法,即业务界定了最大使用需求后,以一个大于需求的缓冲区来实现功能,则可以规避很多错误处理的逻辑,因为反正不会出错,程序会变得很简单。
 
这个时候,我在程序中,256将不再执行减法计算,这算是一种优化了,因为循环中减少不必要的计算,是加快程序运行的设计。至少,不是bug。
 
但是,由于这个老兄的恶意断章取义,或者说温柔点,他能力不够,看不懂,没有把全部的书中信息都粘贴出来,没有看过书的网友看了,自然会以为是书中bug,这种批评,我确实无法接受。
 
至于256没有用宏,是我的习惯,因为这里我做了优化,我也怕我自己Code Review的时候,一时脑子糊涂,看成bug,因此我故意不用宏,就是一个常数,提醒自己注意,这个点有特殊设计,别看错了。
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值