Re: [讨论] 请板友帮忙review置底13诫

楼主: Frozenmouse (*冰之鼠*)   2016-04-16 18:59:21
正式开枪
首先是错字:
“10. 不可在 stack 设置过大的变量,否则会造成 stack overflow”
内文中,static / globla variable 应为 global
再来是这次的主角,null pointer:
“03. 你不可以提取(dereference)不知指向何方的指标(包含 null 指标)。”
“06. 你不可以只做 malloc(), 而不做相应的 free(). 否则会造成内存漏失”
至少在这两条中,内文的字句已经隐含了 NULL == 0
(甚至可能 == nullptr,不过在撰文当时 C++11 应该还没出现就是了)
例如,在 06 中关于 delete 判断的部分
前面说“把指标指到 0”,但后面提供的例子却 assign 为 NULL
03 则更是直接,范例里指到 0 然后马上后面跟注解“起始化为 null pointer”
虽然在大部分的状况下是对的,在某些状况下编译器也可能会自动帮你转换
但仍不能完全排除 NULL 不是 0 的可能性,且 0 也未必是不能使用的位址
参考前阵子的讨论 #1MwJjpRh (C_and_CPP)
和较久以前的讨论 #1Ddq9rDu (C_and_CPP)
以现在的写法,很容易让人误解 NULL 就一定是 0、0 就是空指标
既然置底十三诫的定位是给新手看的,用词有必要更精确一些
我认为在这个前提下,NULL 和 0 混用并不是一个适当的写法
至于怎么改,我还没想到,各种语言标准其实我也不太熟 Orz
也许可以先把内文的 0 指标全换成 NULL
也许可以新增一段解释 0、NULL 和 C++ 后来新增的 nullptr 的差别…
作者: wtchen (没有存在感的人)   2016-04-16 19:03:00
感谢,在C11 standard是这样定义:6.3.2.3-3: An integer constant expression with thevalue 0, or such an expression cast to type void *,is called a null pointer constant.If a null pointer constant is converted to a pointertype, the resulting pointer, called a null pointer,is guaranteed to compare unequal to a pointer to anyobject or function.所以我们不能说NULL是0,这是有问题的。至于要怎么说怎么解释给新手听,还要再想想 Orz
楼主: Frozenmouse (*冰之鼠*)   2016-04-16 19:18:00
还有要怎么解释 if (ptr) { //blah } 这种写法 XD
作者: Caesar08 (Caesar)   2016-04-16 20:14:00
楼上那个只要把pointer的值取出来就好就跟int i=/*number*/; if(i)一样
楼主: Frozenmouse (*冰之鼠*)   2016-04-16 20:31:00
上面那条是((void*)0) -> 空指标,反过来一样吗@@
作者: Caesar08 (Caesar)   2016-04-16 20:37:00
只要是指标,就会储存一个内存位置直接读取指标(不加*),就是读取内存位置现在void pointer指向0,所以if(ptr)就是if(0)
楼主: Frozenmouse (*冰之鼠*)   2016-04-16 20:48:00
我的意思是有没有规定像你说的那样把 null pointer转回数值确定是 0 XD还是我哪里有误解…
作者: Caesar08 (Caesar)   2016-04-16 22:02:00
N4582 http://imgur.com/ZseDxIWThe macro NULL is an implementation-defined C++ nullpointer constant in this International StandardN4582, 18.2, 3但我觉得C++11都出了,为何不用nullptr?直接警告新手,使用nullptr而不是0或NULL
作者: wtchen (没有存在感的人)   2016-04-16 22:11:00
可是C11没有nullptr....
作者: Caesar08 (Caesar)   2016-04-16 22:14:00
... 还好我都是写C++而不是C
楼主: Frozenmouse (*冰之鼠*)   2016-04-16 22:17:00
感谢楼上m(_ _)m
作者: wtchen (没有存在感的人)   2016-04-16 22:18:00
错字改掉了,至于NULL那边要怎么改写还要想 QQ
作者: Caesar08 (Caesar)   2016-04-16 22:22:00
那C与C++可能要分开了,现在nullptr就出问题了
作者: wtchen (没有存在感的人)   2016-04-16 22:33:00
我不反对分开,但是要有人写C++的部份阿
作者: Caesar08 (Caesar)   2016-04-16 22:37:00
只针对13诫,提供C++方面的帮助?(C++要注意太多了)
作者: wtchen (没有存在感的人)   2016-04-16 22:39:00
也行,再看看怎么补充。其实我觉得13诫可能不够要再加...
楼主: Frozenmouse (*冰之鼠*)   2016-04-16 22:40:00
照其他条那样 C++ 用补述的呢?
作者: Caesar08 (Caesar)   2016-04-16 22:40:00
像这边就有C++的guideline https://goo.gl/aHndRh
作者: wtchen (没有存在感的人)   2016-04-16 22:41:00
也是个好方法,C++就劳烦各位帮忙(板工现在忙C的部份)
作者: Caesar08 (Caesar)   2016-04-16 22:41:00
已经有多位大师都在帮忙写这文件,应该不用质疑正确性吧
楼主: Frozenmouse (*冰之鼠*)   2016-04-16 22:41:00
那个连结看到 editors 直接跪了
作者: wtchen (没有存在感的人)   2016-04-17 02:03:00
C的NULL是null pointer constant (空指标常数?)
楼主: Frozenmouse (*冰之鼠*)   2016-04-17 02:08:00
直觉上应该是,而且常被定义为 ((void*)0)((void*)0)符合你引的C11规范里的 null ptr const
作者: wtchen (没有存在感的人)   2016-04-17 02:16:00
繁体中文翻译成空指标常数没错吧?话说该怎么跟新手解释..看来真的该新增一条解释NULL,'\0',0,nullptr的关系有人可以帮忙写吗?要写得让新手了解...嗯...不过想想好像没特殊必要,NULL跟0搞不清楚应该不会毁灭地球....
楼主: Frozenmouse (*冰之鼠*)   2016-04-17 03:57:00
'\0'==0应该没问题,先以推广不要直接把0当null ptr为开始如何?单纯“凡指标必使用NULL / nullptr”这样详细怎么补述还得再想想…
作者: wtchen (没有存在感的人)   2016-04-17 17:22:00
目前先把3跟6的0改成NULL,至于怎么叙述nullptr再想想对了诫3的gets()应该要换掉,不是安全的函式
作者: dreamnook (亚龙)   2016-04-20 10:01:00
朝圣推XD
作者: Yshuan (倚絃)   2016-04-20 17:12:00
用德文念就没问题了(乱入

Links booklink

Contact Us: admin [ a t ] ucptt.com