嗯,豆瓣网某人对我的书《0bug-C/C++商用工程之道》予以***,本来不想回复。
只是最近,一位在大学做教授的朋友,看了书也有一些质疑,我就挑选其中一个比较有代表性的问题做了个解释。后来想想,还是粘贴出来,请大家也都看看。
陈老师好:
嗯,我想了一下,为了避免您有所误解,我这里回答一个某人指出我书中的明显bug,来说明为什么不是bug,请您看看。
下文是豆瓣网原文摘录,网址在这里: http://www.douban.com/review/2971127/
嗯,我想了一下,为了避免您有所误解,我这里回答一个某人指出我书中的明显bug,来说明为什么不是bug,请您看看。
下文是豆瓣网原文摘录,网址在这里: http://www.douban.com/review/2971127/
- P. 188 在 函式 dbg_bin_ascii(char* pPrintBuffer, char* pBuffer, int nLength) 裡
- nCount += SafePrintf(pPrintBuffer+nCount, 256, "%c", *(pBuffer + i));
- 這裡的nCount 是目前已寫入的字元數,所以 256 應改為 256 - nCount,並要防止之溢出。P.189 有 5 個相同錯誤。
- 另外,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这个函数调用。
不过,我这个原作者说,这不是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这个函数调用。
- static int dbg_bin_ascii(char* pPrintBuffer,char* pBuffer,int nLength)
- {
- int i;
- int nCount=0;
- for(i=0;i<nLength;i++)
- {
- if(32<=*(pBuffer+i))
- {
- //可显示
- nCount+=SafePrintf(pPrintBuffer+nCount,256,"%c",*(pBuffer+i));
- }
- else
- {
- //不可显示
- nCount+=SafePrintf(pPrintBuffer+nCount,256,".");
- }
- }
- return nCount;
- }
- static int dbg_bin_hex(char* pPrintBuffer,char* pBuffer,int nLength)
- {
- //...
- }
- void dbg_bin(char* pBuffer,int nLength)
- {
- //...
- }
如您所见,我每行预设打印16Bytes,即dbg_bin_ascii一行,从业务上就界定最多打印16个字符,而如您所见,我预设256的buffer,这是一种常见的手法,即业务界定了最大使用需求后,以一个大于需求的缓冲区来实现功能,则可以规避很多错误处理的逻辑,因为反正不会出错,程序会变得很简单。
这个时候,我在程序中,256将不再执行减法计算,这算是一种优化了,因为循环中减少不必要的计算,是加快程序运行的设计。至少,不是bug。
但是,由于这个老兄的恶意断章取义,或者说温柔点,他能力不够,看不懂,没有把全部的书中信息都粘贴出来,没有看过书的网友看了,自然会以为是书中bug,这种批评,我确实无法接受。
至于256没有用宏,是我的习惯,因为这里我做了优化,我也怕我自己Code Review的时候,一时脑子糊涂,看成bug,因此我故意不用宏,就是一个常数,提醒自己注意,这个点有特殊设计,别看错了。
=======================================================
在线底价购买《0bug-C/C++商用工程之道》
(直接点击下面链接或拷贝到浏览器地址栏)
http://s.click.taobao.com/t_3?&p=mm_13866629_0_0&n=23&l=http%3A%2F%2Fsearch8.taobao.com%2Fbrowse%2F0%2Fn-g%2Corvv64tborsvwmjvgawdkmbqgboq---g%2Cgaqge5lhebbs6qzlfmqmttgtyo42jm6m22xllqa-------------1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2C14%2C15%2C16%2C17%2C18%2C19%2C20---40--coefp-0-all-0.htm%3Fpid%3Dmm_13866629_0_0
肖舸
在线底价购买《0bug-C/C++商用工程之道》
(直接点击下面链接或拷贝到浏览器地址栏)
http://s.click.taobao.com/t_3?&p=mm_13866629_0_0&n=23&l=http%3A%2F%2Fsearch8.taobao.com%2Fbrowse%2F0%2Fn-g%2Corvv64tborsvwmjvgawdkmbqgboq---g%2Cgaqge5lhebbs6qzlfmqmttgtyo42jm6m22xllqa-------------1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2C14%2C15%2C16%2C17%2C18%2C19%2C20---40--coefp-0-all-0.htm%3Fpid%3Dmm_13866629_0_0
肖舸