是否存在使用g ++ 无法正确编译有效C代码的情况
可能重复:
“C ++的C子集” – >哪里没有? 例子?
我知道C是C ++的一个子集(即不存在有效的C代码,它不是有效的C ++代码)。 我的问题是g++
是否与所有C代码完全兼容。 例如,将
g++ -o testing test.c
产生相同的二进制文件
gcc -o testing test.c
在所有情况下?
更具体地说,如果他们并不总是创建相同的二进制文件,那么有什么理由可能会出现问题吗? 如果我不确定代码,总是使用g++
是否安全?
C不是C ++的子集。
尝试:
foo.c的
int main() { int class = 0; return 0; }
无论如何,这里有趣: C在哪里不是C ++的子集?
很难弄清楚如何回答这个问题:
- C不是C ++的完整子集。 C中有几件事是无效的C ++。 可变长度arrays就是这样的一种。 来自
void*
隐式演员阵容是另一个。 - g ++接受的代码取决于传递给它的标志。 是通过调用
g++
(哪个版本?)或使用-ansi
编译的?-pedantic
?std=
怎么样? - 最后,代码是否被接受与“是否产生相同的二进制”完全不同。 两个编译器都接受的代码可能会导致二进制文件执行相同的操作,但仍然不完全相同 。
考虑到所有这些模糊性,我们无法给出明确的答案。
C不是C ++的子集。 它从未如此。 C99与C ++有很大的不同,但即使是经典的C89 / 90也不是C ++的一个子集,具有很多显着的差异。
即使对于C89 / 90,在C ++编译器下“破坏”有效C代码的差异也将包括
- C ++中更严格的隐式指针类型转换
- 嵌套的struct声明在C ++中是类范围的,在C中以文件为范围
- 运算符语法(以及结果运算符优先级)在语言之间略有不同
- 暂定的定义在C ++中是非法的
- 新的关键字,C ++中没有隐式的
int
规则…… - 等等等等