如果我们想用C语言编写一个模块,并且必须用
g++
编译为C ++,那么是否可以使用C中的“全局/静态函数”而不是自己的类来开发C ++代码?简单地说,在C++ 中以C语言方式编码(只需更改几个系统头文件等)是否可行?是的。实际上,这通常是个好主意,因为C++比C实施了更强的类型检查。
void *
,但这就是C++更加严格的全部内容。另一方面,C对于检查指针参数的“const”性更加严格。因此,我认为这种分类并没有太大帮助。 - Jens Gustedtconst int a = 0; int* b = &a; float* b = &a;
。如果你的编译器是由明智的人编写的,它将会发出一些警告。这只能发出警告,因为这段代码是有效的C(即使是C99,据我所知)。是的,好的编译器引起警报的事实使这不再像是一个十拍进三的事情,但是我更希望一个强制执行正确行为而不是建议正确行为的编译器。我不理解const参数的争论。如果你指的是自动从字符串字面量中删除const的参数,那就只是一个C兼容性问题。 - Marcelo Cantossizeof('a')
时,我不小心写成了fprintf("sizeof('a') == %d", sizeof('a'));
。gcc版本给了我一个警告,但我忽略了它,然后在运行时出现了总线错误;g++则显示了error: cannot convert ‘const char*’ to ‘FILE*’ ...
。 - Marcelo Cantosint const*
赋值给float*
是无效的,这是一个约束违规。看起来你对C99并不了解。而C语言的第一条规则就是不应该忽略编译器给出的警告,就这么简单。如果需要,只需使用-Werror
选项即可。我的gcc版本(称为c99
)在你的虚假fprintf
行上会输出三个可怕的警告,你怎么能有忽略它们的想法呢? - Jens Gustedtconst int*
到 float*
转换时使用 gcc -std=c99 ...
也只会产生一个警告而非错误。其次,你错过了我的观点。C(相对于你选择的 C 编译器)与 C++ 没有相同的类型安全性。因此,C++ 编译器不会编译出这样的虚假转换,而 C 编译器必须使用选项来避免出现问题。我选择了 "enforces" 这个词很仔细。 - Marcelo Cantos虽然大多数C源代码可以直接编译为C++代码,但是某些语言差异使得C++不能成为C的严格超集。
C中有效,但在C++中无效。
int *j = malloc(sizeof(int) * 5);
在以下两个方面有效:
int *j = (int *) malloc(sizeof(int) * 5);
您可以在这里找到详尽的不同之处列表:here
extern "C"{...}
中了。 - Marcelo Cantos<cstdio>
。C++库保证提供 <stdio.h>
(D.5)。好吧,它已经被弃用了,但在C++中,弃用意味着“当前标准要求存在,但未来标准可能不再需要”。相反,未被弃用的功能是当前标准要求存在,但未来标准可能不再需要的;-) - Steve Jessop.h
头文件是否也保证将符号放在全局命名空间中? - Kerrek SBstd
。 - Steve Jessop我不认为有任何理由这样做,g++和gcc只是同一个编译器的不同前端。因此,就效率、字节兼容性等方面而言,混合使用由两者产生的.o
文件应该没有问题。
C和C++之间存在许多微妙的差异,可能会给你带来麻烦,从sizeof 'a'
与sizeof c
不同(如果c
是char
)开始,到bool在其中一个中是类型,在另一个中是宏,true
在C++中是bool
类型,在C中是int
类型,C不允许在for
中进行static
声明......
即使C和C++有很大的交集,如果你限制自己只使用两个社区都认为是良好编码实践的内容,你很快就会发现交集几乎为空。这涉及指针转换、使用malloc
或new
进行分配、复合初始化程序与构造函数、可变长度数组与向量类......
别这么做了。你所需要的只是创建一个适用于两者的良好接口。
sizeof('a')
是多么不直观(出于我的无知,我不得不运行一个测试才能明白你在说什么),这很可能是一个错误。任何定义了 bool 类型的 C 库都应该有良好的判断 #ifdef __cplusplus ...
(我的 <stdbool.h>
副本就是这样)。除非有人愚蠢到使用算术运算符操纵它们(这很可能是一个错误),否则 true
是 bool
还是 int
不应影响为 C 编写的程序的正确性。最后,在 C 程序中,静态声明不会出现在 for
循环中。 - Marcelo Cantosbool
,那么只需测试并发布 C 编译器生成的内容即可。 - Marcelo Cantosg++
和gcc
不是同一个编译器的两个不同前端。cc1plus
和cc1
)的两个不同驱动程序,共享相同的中间代码和后端代码(在GCC源码树内的gcc/libbackend.a
中,这个名称有误,因为它包含了中间代码(中间代码是GCC的通用部分,适用于C、C++、Ada、Fortran、Objective-C等多种目标机器;它是GCC最大的部分,工作在一组常见的内部表示中,尤其是Gimple)和后端(GCC的部分将Gimple表示转换为汇编代码,使用RTL - 一种目标相关的内部表示)。
#ifdef __cplusplus
或等效的方式。有了这个,你可以使你的代码在两者上编译而没有任何问题。 - ssube