是否存在使用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编译的? -pedanticstd=怎么样?
  • 最后,代码是否被接受与“是否产生相同的二进制”完全不同。 两个编译器都接受的代码可能会导致二进制文件执行相同的操作,但仍然不完全相同

考虑到所有这些模糊性,我们无法给出明确的答案。

C不是C ++的子集。 它从未如此。 C99与C ++有很大的不同,但即使是经典的C89 / 90也不是C ++的一个子集,具有很多显着的差异。

即使对于C89 / 90,在C ++编译器下“破坏”有效C代码的差异也将包括

  1. C ++中更严格的隐式指针类型转换
  2. 嵌套的struct声明在C ++中是类范围的,在C中以文件为范围
  3. 运算符语法(以及结果运算符优先级)在语言之间略有不同
  4. 暂定的定义在C ++中是非法的
  5. 新的关键字,C ++中没有隐式的int规则……
  6. 等等等等