如果我们想用C编写一个模块并且必须用g++
将它编译为C ++,那么在没有任何自己的类的情况下用C ++开发一段代码是否可行,只使用“全局/静态函数”如在C?所以,简单地说,用C ++编写代码C(只有很少的系统头改变等)。
答案 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 ++中无效
int *j = malloc(sizeof(int) * 5);
两者均有效:
int *j = (int *) malloc(sizeof(int) * 5);
您可以找到详尽的不同列表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
相同的事情开始(如果c
是char
}),bool是一个类型,另一个是宏,true
在C ++中是bool
类型,在C中是int
,C不允许static
声明在for
...
即使C和C ++有一个大的交集,如果你把自己限制在两个社区中被认为是良好的编码实践,你很快就会发现交集几乎是空的。这涉及指针强制转换,malloc
或new
分配,复合初始化器与构造函数,可变长度数组与向量类...
就是不要这样做。您所需要的只是创建一个适合两者的漂亮界面。
答案 5 :(得分:0)
不,g++
和gcc
不是同一编译器的两个不同的前端。
它们是两个不同的驱动程序,用于两个不同的编译器(cc1plus
和cc1
)共享相同的中端和后端代码(使用GCC构建树,内部gcc/libbackend.a
,用词不当,因为它包含中端(中端是GCC的常见部分,C,C ++,Ada,Fortran,Objective-C,...和许多目标机器共有) ;它是GCC最重要的部分,并且处理一组通用的内部表示,特别是Gimple)和后端(GCC将Gimple表示转换为汇编的部分,使用RTL - 依赖于目标的内部表示)。
但是cc1和cc1plus有不同的前端代码。