"Clean C"是什么,它与标准C有何区别?

13

纯C和C++中的C有什么区别?

'Clean C'是Lua基于哪些细节的?它们有哪些特点?


1
请只选择一个问题进行提问。 - Chris Eberle
3
好的,谷歌给了我这个页面什么是Clean C?,可能与此有关。 - user166390
为什么它不叫做“纯净的C ++”? - Jens Gustedt
5
就我个人而言,我会称它为“不太干净”的C语言——需要使用void指针进行类型转换,没有指定初始化或复合字面量——一想到这些就感觉很不爽;) 开玩笑的,如果你想(或需要)支持MSVC,那么使用C和C++的公共子集是一种悲哀的必要性... - Christoph
更近期的参考资料:Clean C - chqrlie
显示剩余3条评论
2个回答

23

Clean C是Harbison & Steele的书籍(C: A Reference Manual, Prentice Hall)中提出的术语。如果一个程序可以被标准的C编译器和标准的C++编译器编译,并且其执行结果与这两个编译器的不同行为相同(优化问题无关),则称该程序是用Clean C编写的。


@pst 是 Harbison & Steele 的书中创造的术语,这不是参考吗? - Mysticial
@pst 我在我的H&S副本中找不到页码,但是许多人在comp.lang.c中提到了这个术语和H&S。 - ouah
1
请尝试阅读《C:ARM》第5版的第1.1.5节“标准C++”(第5页)。 - ldav1s
1
@Mysticial 不,它是一个引用。ANSI标准才是“the”参考。 - user207421
5
这个名称真是糟糕透了。我认为“干净的C”应该指的是C代码不使用强制类型转换运算符、不使用非原型函数声明、不调用未定义行为或依赖于实现定义的行为,并且不需要编译器发出任何标准所要求的诊断消息。当然,这与“干净的C”的“实际”定义是互相排斥的,因为在使用malloc时需要可怕的类型转换瘋狂... - R.. GitHub STOP HELPING ICE

3

有一个在C++中最显而易见的区别是你必须强制转换malloc的返回值。此外,C++中的结构体会自动typedef。

对于C代码,请始终使用C编译器,而不是C++。C++与C不完全兼容。

其他一些区别可能包括:

  • 在C中,声明void func();表示声明了一个未指定参数的函数,而在C++中,void func();相当于C void func(void),即不带参数;
  • C++要求原型声明,而在C中通常只是警告;
  • 字符常量(如'a')在C中为int类型,在C++中为char类型;
  • 字符串字面值在C中为char []类型,在C++中为const char []类型;
  • C中某些合法的变量名(例如class)在C++中是保留关键字。

请看链接 http://david.tribble.com/text/cdiffs.htm,其中包含有关编程的内容。 - Christoph
“void func()”未指定其参数是什么意思?这在实际中怎么使用? - Victor Zamanian
@VictorZamanian 调用约定允许您在C中传递不正确数量的参数而不崩溃。当然,如果被调用者对您的“不正确”参数做了什么坏事,那么它就是未定义的行为。您只需声明返回值为空即可。C允许一些极端的懒散行为。我认为您传递给类似于此类声明的任何参数都将被假定需要转换为int。不确定,我真的不关心这样的琐事。我会声明我的参数。 :) - doug65536
啊,谢谢。我不知道那个。在这种情况下,将参数声明为 void 可能是值得的。 :-) - Victor Zamanian
在C语言中,声明void func();表示声明一个函数,但没有指定其参数。而在C++中,void func();等同于C语言的void func(void),即不接受任何参数。然而,在C23标准中,情况已经发生了改变。 - Mehdi Charife

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接