从C语言迁移到C++是否有任何指南?

5

我想知道是否有一些迁移从C到C++的指南链接。

我主要关心的是检查C代码中可能存在的编译器无法检测到问题的结构?有哪些解决方法?

注意:请不要回答编译器能够检测到的事情。


1
你能给我们提供更多的背景信息吗?为什么你想要使用C++? - Carl Norum
4
正确的思考方式是认识到C++和C是两种不同的语言,它们不是超集/子集关系,C++也不是具有扩展功能的C语言等。在C++中正确的做事方式与在C语言中完全不同。如果你将C代码声明为C++代码,那么你就写了糟糕的C++代码,应该删除或重构它。 - GManNickG
3
@GMan: 将C++用作更好的C是完全有效的。 在C中使用的每种方法在C++中同样适用。 将C代码复制到C++项目中不是糟糕的C++代码,它可能不太优化,但与其作为C代码一样不会更差。 仅仅严格的类型检查和原型要求就足以成为编译为C ++的优秀理由,即使您从未使用过在C中找不到的任何单个C ++功能。 - Ben Voigt
3
@Ben Voigt说:“C中有效的所有方法在C++中同样有效。”这并不完全正确。一个常见的例子是使用malloc()分配内存;在C++中通常不这么做,如果你还是这么做,你必须从void转换为例如int。但在C中则不需要这样。 - Bastien Léonard
2
@GMan,@dan04,@Bastien,@Kornel:你们所有人都用了错误的标准来衡量。首先,显然这是一个嵌入式系统,所以异常可能完全不可接受。其次,即使假设桌面环境下额外的空间要求和延迟并不成问题,在没有异常处理的情况下从C转向C++仍然是一种改进。好吧,写作风格有些问题的人应该在任何面试中都不称自己是C++专家,但这并不意味着公共子集加上少数有限的C++特性比C更差。 - Ben Voigt
显示剩余7条评论
5个回答

7

谢谢指点。这真的是一个很好的起点。我知道我应该更经常地在维基百科上思考。 - Vicente Botet Escriba
@Vincente:不客气。很抱歉这仍然需要你进行相当多的调查。 - Tony Delroy

3

你的意思是在已经掌握C语言的前提下学习C++吗?还是指将一个C项目翻译成C ++?如果是后者,并且该项目规模较大,我建议不要这样做。如果该项目有任何发展势头,那么这就是自杀行为;这是浪费时间、精力、动力和积极性。


2
介绍一些仅限于C++的构造并不会有太大的影响(例如使用STL进行一些新功能)。只是不要试图将所有旧代码都转换为C ++。 - J-16 SDiZ
1
@ J-16 SDiZ:我甚至会对此持谨慎态度。有一些需要注意的地方。例如,C++调用C再调用C++现在抛出异常。异常不能越过这里的C边界(可能导致应用程序终止)。 - Martin York
1
我是指将一个C项目从C迁移到C ++。感谢您的建议。 - Vicente Botet Escriba
与Kornel的“答案”一样,这也是一条评论/意见,甚至没有试图回答所提出的问题。 - Tony Delroy
@Martin:通过C代码抛出异常。 - Conrad Meyer
显示剩余14条评论

2

《Effective C++》的前两版主要是针对从C转向C++的程序员,帮助他们避免一些陷阱。我建议选择第二版(它基本上是第一版的修订版)。

也许我的答案无效,因为实际上GCC有一个“Effective C++”标志。此外,使用现代警告(如严格别名等)启用所有警告后,如果您能使所有内容都编译通过,那么您就已经非常接近完美的C++了。


2

你必须放下你所学过的。

更加严肃地说——教授 C++ 的最大错误就是将其视为 C 语言的超集。C 和 C++ 是两种有不同问题解决方法的语言。虽然它们的语法非常相似,但是解决问题的方法是不同的。虽然大多数符合 C 语言规范的程序也适用于 C++,但这只是在 C++ 基础上构建的副作用。

使用 C++ 编译器重新编译 C 项目并不能使其成为 C++ 项目。


1
这只是一条评论/意见,而不是回答所提出的问题。我们没有理由认为Vincente不是一个优秀的C++程序员,或者需要放弃什么;他只是在询问是否有特定部分的程序应该被搜索、验证和纠正,以便在使用C++编译器编译时可靠地运行程序。 - Tony Delroy
@Tony 谢谢你的澄清。你恢复了我所寻找的内容。 - Vicente Botet Escriba

2
除了你已经知道的东西,我想,new/deletemalloc/free等,有一个重要的危险,那就是C风格的转换。如果你的代码有很多这样的转换(通常这是不好的C代码),由于语法的缘故,它们很难找到。但你应该将它们全部转换为正确的C++风格转换。
此外,还有一些微妙的事情,两者的解释方式不同,很难发现,并且可能在你进行这种转换后的任何时间都会出现问题,从一周到10年不等。
标识符就是这样的一个事情。试着找出在C++中stat是指函数还是struct stat。在这个例子中这并不太糟糕,因为编译器可能会告诉你。但还可能有其他隐藏的问题。在这里,sizeof表达式是一个特别的陷阱,因为它们可以应用于一个表达式或一个类型。 sizeof总体上是你应该系统地检查的东西。例如,在C中,sizeof('a')sizeof(int)相同,在C++中,sizeof(char)(所以是1)。对于枚举常量与枚举变量也是如此。

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