用C风格编写C ++代码

时间:2011-11-11 10:22:00

标签: c++ c gcc

如果我们想用C编写一个模块并且必须用g++将它编译为C ++,那么在没有任何自己的类的情况下用C ++开发一段代码是否可行,只使用“全局/静态函数”如在C?所以,简单地说,用C ++编写代码C(只有很少的系统头改变等)。

6 个答案:

答案 0 :(得分:7)

是。事实上,这通常是一个好主意,因为C ++强制执行比C更强的类型检查。

答案 1 :(得分:4)

除了仅使用函数之外,您还需要执行一些操作,特别是您应将所有函数标记为extern "C",以避免名称损坏并强制执行C调用约定(以及顺便说一句阻止你超载)。如果您希望能够在C中编译它,则在声明变量(枚举struct)时必须使用enum限定类型,或者提供相应的typedef ...

或者,您可以将-x c添加到编译器选项,以告诉g ++将代码编译为C(如果您无法将命令行从g++更改为gcc,你可能无法添加编译器标志......)

答案 2 :(得分:4)

虽然大多数C源代码将编译为C ++代码而不进行任何更改,但某些语言差异会阻止C ++成为C的严格超集。

在C中有效,但在C ++中无效

  • C ++有新的关键字(类,模板,虚拟等),如果你打算用C ++编译器编译它,你不应该把它当作你的C代码使用
  • C ++有很多限制性的类型转换:

在C中有效但在C ++中无效

int *j = malloc(sizeof(int) * 5);

两者均有效:

int *j = (int *) malloc(sizeof(int) * 5);
  • 枚举常量(枚举值)在C中始终为int类型,而它们在C ++中是不同的类型,可能与int的大小不同。
  • C允许在函数原型中声明struct,union和enum类型,而C ++则不允许。

在C和C ++中表现不同

  • 字符文字如'a'在C中的类型为int,在C ++中的类型为char
  • 在C中使用static关键字将函数或全局变量限制为文件范围(内部链接)。这在C ++中也是有效的,尽管C ++不赞成使用匿名命名空间(在C中不可用)。此外,C ++隐式地将任何const全局视为文件范围,除非它是显式声明的extern,不像C,其中extern是默认值。相反,C中的内联函数属于文件范围,而默认情况下它们在C ++中具有外部链接。

您可以找到详尽的不同列表here

答案 3 :(得分:2)

你可以用很多样式“编写C ++” - 这是该语言的基本优势之一。这包括C程序通用的严格程序,平面编程风格。你仍然会编写C ++,但代码最终应该对任何C程序员都非常熟悉。

严格地说,您必须使用C ++标头<cstdio>等,并且所有C库函数都在std命名空间中。也许这是您应该使用using namespace std;的少数合法情况之一! : - )

答案 4 :(得分:1)

我没有看到任何这样的理由,g ++和gcc只是同一编译器的不同前端。因此,对于所有涉及效率,字节兼容性等问题,混合由{2}生成的.o文件应该没有问题。

C和C ++有许多微妙的差异可能会给您带来麻烦,从sizeof 'a'等不同但sizeof c相同的事情开始(如果cchar }),bool是一个类型,另一个是宏,true在C ++中是bool类型,在C中是int,C不允许static声明在for ...

即使C和C ++有一个大的交集,如果你把自己限制在两个社区中被认为是良好的编码实践,你很快就会发现交集几乎是空的。这涉及指针强制转换,mallocnew分配,复合初始化器与构造函数,可变长度数组与向量类...

就是不要这样做。您所需要的只是创建一个适合两者的漂亮界面。

答案 5 :(得分:0)

不,g++gcc不是同一编译器的两个不同的前端。

它们是两个不同的驱动程序,用于两个不同的编译器(cc1pluscc1)共享相同的中端和后端代码(使用GCC构建树,内部gcc/libbackend.a,用词不当,因为它包含中端(中端是GCC的常见部分,C,C ++,Ada,Fortran,Objective-C,...和许多目标机器共有) ;它是GCC最重要的部分,并且处理一组通用的内部表示,特别是Gimple)和后端(GCC将Gimple表示转换为汇编的部分,使用RTL - 依赖于目标的内部表示)。

但是cc1和cc1plus有不同的前端代码。