是否存在任何情况下有效的 C 代码无法使用 g++ 正确编译[重复]

问题描述 投票:0回答:3

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

我知道 C 是 C++ 的子集(即不存在不是有效 C++ 代码的有效 C 代码)。 我的问题是

g++
是否与所有C代码完全兼容。 例如,将

g++ -o testing test.c

生成与

相同的二进制文件
gcc -o testing test.c

在所有情况下?

更具体地说,如果他们并不总是创建相同的二进制文件,是否有任何原因可能会出现问题? 如果我不确定代码,始终使用

g++
是否安全?

c++ c gcc g++
3个回答
12
投票

C 不是 C++ 的子集。

尝试:

foo.c

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

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


3
投票

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

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

考虑到所有这些含糊之处,不可能给你一个明确的答案。


2
投票

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

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

  1. C++ 中更严格的隐式指针类型转换
  2. 嵌套结构声明在 C++ 中是类范围,在 C 中是文件范围
  3. 不同语言的运算符语法(以及由此产生的运算符优先级)略有不同
  4. 暂定定义在 C++ 中是非法的
  5. 新关键字,C++ 中没有隐式
    int
    规则...
  6. 等等等等
© www.soinside.com 2019 - 2024. All rights reserved.