是否存在使用g ++无法正确编译有效C代码的情况

时间:2012-07-26 18:24:52

标签: c++ c gcc compiler-construction g++

  

可能重复:
  “C subset of C++” -> Where not ? examples?

我知道C是C ++的一个子集(即不存在有效的C代码,它不是有效的C ++代码)。我的问题是g++是否与所有C代码完全兼容。例如,

g++ -o testing test.c

生成相同的二进制文件

gcc -o testing test.c

在所有情况下?

更具体地说,如果他们并不总是创建相同的二进制文件,那么有什么理由可能会出现问题吗?如果我不确定代码,总是使用g++是否安全?

3 个答案:

答案 0 :(得分:6)

C不是C ++的子集。

尝试:

foo.c的

int main() {
    int class = 0;
    return 0;
}

无论如何在这里玩得开心:Where is C not a subset of C++?

答案 1 :(得分:3)

很难弄清楚如何回答这个问题:

  • C不是C ++的完整子集。 C中有几个无效的C ++。可变长度阵列就是这样的一种。来自void*的隐式演员阵容是另一个。
  • g ++接受的代码取决于传递给它的标志。它只是通过调用g++(哪个版本?)或-ansi来编译? -pedanticstd=<lang>怎么样?
  • 最后,代码是否被接受与“是否产生相同的二进制”完全不同。两个编译器都接受的代码可能会导致二进制文件执行相同的操作,但仍然不是相同的

鉴于所有这些含糊不清的情况,我们无法给出明确的答案。

答案 2 :(得分:2)

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

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

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