幻の上帝 幻の上帝
关注数: 156 粉丝数: 1,931 发帖数: 72,393 关注贴吧数: 291
[备份]关于Linus 07年喷C++一事的意见 除非有新论据,不想多打字,以后有煋的拿这个盖棺定论。 1.炮轰C++用得着摊上Linus Torvalds?他算老几?维护过实现和哪个语言的标准?哪怕用了几年C++写出点什么东西没?C或许还过得去(只是“过得去”是因为某种意义上用了十几年都没喷光明正大喷C语言的,就差不多也不算会C了),评论C++……不是说笑?这件事只不过git是导火索,而git刚好是Linus带头维护的罢了,充其量也就是个八卦,犯得着炒个几年? 2.逮到“抽象”喷我就笑了……有小白拿OOAD的结果当abstraction,还要迎合着犯二?操作系统没有抽象?语言没有抽象?数学没有抽象?这里最关键的是,资源管理本来就是建立在抽象的基础上,自己还要打脸。 3.“设计”更是笑料。资源管理贯穿始终都无视的还给人强调“设计”?不就是用C给的吊死抽象(resource=memory,用在Lisp上或许还行,C嘛……)给坑了的二等残废? 4.有些结论是对的(尽管过程无厘头),比如对于大多数人来说C++确实更容易写出烂代码导致管理成本问题(所以也许可能大概真的不适合Linus管的项目)。不过这就够推出C++烂?这点逻辑问题都搞不明白,哪根线搭错了?(C++在接口的设计和实现上真的烂……不过要我说的话大部分是拜C所赐,其它不少也有因为和C相似的原因。) 5.关于“心智包袱”。导致C++烂代码的心智包袱主要有两个,一个是关于抽象和OO的乱七八糟的概念不清,另一个就是脑残C原教旨主义依赖渣渣类型系统之类特性的抽象(具体点的一例如乱用指针;再如鉴定错误码一百年不动摇)。现实中后者往往还更麻烦(因为编译什么的可能没问题换人维护了才发现很混乱)。这点C是没得选择,C++提供了选择却利用更笨更麻烦的办法是闹哪样,只是为了逃避学习?那承认自己烧饼不是更干脆,扭扭捏捏作甚?到底谁有包袱?
[备份]关于Linus 07年喷C++一事的意见 除非有新论据,不想多打字,以后有煋的拿这个盖棺定论。 1.炮轰C++用得着摊上Linus Torvalds?他算老几?维护过实现和哪个语言的标准?哪怕用了几年C++写出点什么东西没?C或许还过得去(只是“过得去”是因为某种意义上用了十几年都没喷光明正大喷C语言的,就差不多也不算会C了),评论C++……不是说笑?这件事只不过git是导火索,而git刚好是Linus带头维护的罢了,充其量也就是个八卦,犯得着炒个几年? 2.逮到“抽象”喷我就笑了……有小白拿OOAD的结果当abstraction,还要迎合着犯二?操作系统没有抽象?语言没有抽象?数学没有抽象?这里最关键的是,资源管理本来就是建立在抽象的基础上,自己还要打脸。 3.“设计”更是笑料。资源管理贯穿始终都无视的还给人强调“设计”?不就是用C给的吊死抽象(resource=memory,用在Lisp上或许还行,C嘛……)给坑了的二等残废? 4.有些结论是对的(尽管过程无厘头),比如对于大多数人来说C++确实更容易写出烂代码导致管理成本问题(所以也许可能大概真的不适合Linus管的项目)。不过这就够推出C++烂?这点逻辑问题都搞不明白,哪根线搭错了?(C++在接口的设计和实现上真的烂……不过要我说的话大部分是拜C所赐,其它不少也有因为和C相似的原因。) 5.关于“心智包袱”。导致C++烂代码的心智包袱主要有两个,一个是关于抽象和OO的乱七八糟的概念不清,另一个就是脑残C原教旨主义依赖渣渣类型系统之类特性的抽象(具体点的一例如乱用指针;再如鉴定错误码一百年不动摇)。现实中后者往往还更麻烦(因为编译什么的可能没问题换人维护了才发现很混乱)。这点C是没得选择,C++提供了选择却利用更笨更麻烦的办法是闹哪样,只是为了逃避学习?那承认自己烧饼不是更干脆,扭扭捏捏作甚?到底谁有包袱?
[原创]关于main函数的原型和返回值 发现以前说的太零碎,不太好引用……整理一下。 目前我看到的比较靠谱的说法(有正确的引用出处,并指出了实现扩展): homepage.ntlworld.com/jonathan.deboynepollard/FGA/legality-of-void-main.html tieba.baidu.com/p/626323902 ↑而这里的说法是有问题的。 这里再解释一下ISO C/C++中对main的要求。 0.标准版本说明: ANSI C89指ANSI X3.159-1989,后来被采纳为ISO/IEC 9899:1990,通称C90。两者正文仅有格式变化(另外C90不包含Rationale)。 C99指ISO/IEC 9899:1999,被ANSI于2000年5月采纳。 C11指ISO/IEC 9899:2011,是现行正式C语言国际语言标准。 ISO C++98指ISO/IEC 14882:1998,是第一个C++语言国际标准。 ISO C++03指ISO/IEC 14882:2003,是第二版C++语言国际标准,对上一版只有小的修正。 ISO C++11指ISO/IEC 14882:2011,是现行C++语言国际标准,有较大改动。 ANSI C一般即ANSI C89。实际上也只有这版标准是先ANSI后ISO。 在本文问题上,ANSI C89和C90、C99和C11、C++标准各个版本这三组标准之间分别没有实质变化(或根本一模一样),所以只引用最早的标准文本。 1.首先是几个背景知识。 本文所讲的实现即语言实现,可以是编译器+链接器等等,可以是解释环境。一般是前者。 关于implementation-defined等确切含义可以Google。 1.1.ANSI C89支持函数声明省略返回值,隐含为int。 也就是说main()其实是int main(),foo();其实是int foo();。尤其注意main()绝不是void main()。 这在ISO C99开始以及ISO C++中是不允许的。 1.2.关于参数返回值列表。 C语言的(void)表示不接受任何参数,相当于C++的(),也和C++的(void)等价。 C语言的()表示接受任何参数,相当于C++的(...)。 所以 在C语言中int main(void),void不能省略,否则就是另一个函数原型了。 而 C++中,不接受任何参数的参数列表写成(void)是不必要的(虽然也没错,但正式写法都没有这种无谓的罗嗦)。 1.3 实现环境分类。 ISO C/C++中,根据对环境的要求,分为两类,一类是独立实现(freestanding implementation),另一类是宿主实现(hosted implementation)。 独立实现对环境的要求比较低,所以更自由。宿主实现——一般可以看作是有操作系统的实现,提供了比较多的底层接口,约束比较多。 当然C和C++之间对两者的要求有所不同。为简化问题,除了main相关的部分在下文讨论以外,不再提及。 1.4 ISO标准文档中的情态动词的含义。 以下全部节录(供参考,只想看结论的可以跳过)。 表格项分隔使用|,同一格内不同项使用/。 ISO/IEC Directives, Part 3 Annex E(normative) Verbal forms for the expression of provisions NOTE Only singular forms are shown. The verbal forms shown in Table E.1 shall be used to indicate requirements strictly to be followed in order to conform to the standard and from which no deviation is permitted. Table E.1 — Requirement Verbal form Equivalent expressions for use in exceptional cases(see 6.6.1.3) shall|is to/is required to/it is required that/has to/only … is permitted/it is necessary shall not|is not allowed [permitted] [acceptable] [permissible]/is required to be not/is required that … be not/is not to be Do not use “must” as an alternative for “shall”. (This will avoid any confusion between the requirements of a standard and external statutory obligations.)
首页 1 2 3 下一页