发件人:Noone Really <nooneatnowhere@earthlink.net>
新闻组:comp.lang.c
主题:回复:FAQ 20.27:C++ 是否是 C 的超集?我可以使用 C++ 编译器编译 C 代码吗?
日期:1999 年 1 月 31 日星期日 17:47:25 -0700
消息 ID:<36B4F99D.97D84E5D@earthlink.net>

Larry Weiss 写道
> FAQ 20.27 承诺“一些合法的 C 结构在 C++ 中是不合法的”。我想看到一些这样的例子。
> 我想看到一些这样的例子。

FAQ 中所说的 C 是指当前语言,我猜我们现在仍然是这样认为的,而不是 C9x 的提案。

有很多这样的情况。我曾经列过一个相当大的列表,但现在不记得了。不过,你只是要求例子

1) 从void *到任何对象/不完整类型的自动转换

    void *one; char *two =one;

2) 新的关键字(许多)

    int new;

3) 由于结构体变成了作用域

      struct x {
        struct y { int z; } w;
      };
      struct y v;

4) 由于结构体标签变成了 typedef

    struct y {int z;};
    int f(int(y)); f(3);

5) 由于需要原型

     int f(); f(3);

6) 隐式的 int 规则

     main(){}

7) main 函数的递归调用

8) 由于 // 注释

   int x = 2//*why???*/2;
   int y;

> FAQ 20.27 还承诺“这两种语言对一些常见构造的含义
> 定义也不同”。我想看到
> 一些这样的例子。

一些我立即想到的例子

1) 由于 // 注释

   int x = 2//*why???*/2
   ;

2) 由于字符字面量的类型char而不是int等等。
所以,如果 sizeof(int) != 1,

   sizeof('a')
这两种语言就存在差异

3) 由于结构体作用域

   struct y {int z;};
   {
    struct x {
        struct y { char z; } w;
    };
    struct y v;
    return sizeof v.z;
   }

此外,有很多 C 编译器需要发出诊断的案例,但在 C++ 中不是必需的,因为它们是合法的 C++ 代码。这有点显而易见,因此我没有提供例子。