6

可能重复:
“C++ 的 C 子集”-> 哪里没有?例子?

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

g++ -o testing test.c

产生一个相同的二进制文件

gcc -o testing test.c

在所有情况下?

更具体地说,如果它们并不总是创建相同的二进制文件,是否有任何理由表明这可能是一个问题?g++如果我不确定代码,总是使用它是否安全?

4

3 回答 3

8

C 不是 C++ 的子集。

尝试:

foo.c

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

无论如何,在这里玩得开心: C 哪里不是 C++ 的子集?

于 2012-07-26T18:30:16.693 回答
3

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

  • C 不是 C++ 的完整子集。C 中有几样东西不是有效的 C++。可变长度数组就是这样一种东西。隐式转换 fromvoid*是另一个。
  • g++ 将接受什么代码取决于传递给它的标志。它是通过调用g++(哪个版本?)还是用-ansi? -pedantic? 怎么样std=<lang>
  • 最后,代码是否被接受与“它是否产生相同的二进制文件”是一个完全不同的问题。两个编译器都接受的代码可能会导致执行相同操作但仍然不相同的二进制文件。

鉴于所有这些含糊不清,不可能给你一个明确的答案。

于 2012-07-26T18:32:10.697 回答
2

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

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

  1. C++ 中更严格的隐式指针类型转换
  2. 嵌套结构声明在 C++ 中是类范围的,在 C 中是文件范围的
  3. 运算符语法(以及由此产生的运算符优先级)在语言之间略有不同
  4. 暂定定义在 C++ 中是非法的
  5. 新关键字,intC++ 中没有隐式规则...
  6. 等等等等
于 2012-07-26T18:36:31.353 回答