发件人:Richard Stamp
新闻组:comp.lang.c
主题:回复:常见问题解答 20.27:C++ 是 C 的超集吗?我可以使用 C++ 编译器编译 C 代码吗?
日期:1999 年 2 月 1 日星期一 10:24:40 -0000
消息 ID:<793v82$hs6$1@flex.london.pipex.net>

Larry Weiss 写道……
>大家能回想起 C 代码在交给 C++ 编译器时具有
>不同语义的具体实例吗?(我没有
>上面引用的 H&S 参考资料,但我假设它详细说明了
>其中一些情况?)

我于 1998 年 2 月 14 日发布了以下内容,总结了 H&S 中提到的情况。抱歉用词有些肯定——这在当时的情境下是合适的。

---
在 C++ 中,您不能使用标识符 asm、bool、catch、class、const_cast、delete、dynamic_cast、false、friend、inline、mutable、namespace、new、operator、private、protected、public、reinterpret_cast、static_cast、template、this、throw、true、try、typeid、using 或 virtual。您不能在 struct 定义内声明一个类型,并使其在外部可见。您不能在类型声明中使用存储类说明符。您不能从另一个翻译单元引用没有显式存储类的顶层 'const' 对象。您不能用“太长”的字符串字面量初始化字符数组。您不能在未先声明函数的情况下调用函数。您不能使用旧式函数定义。您不能将枚举常量用作整数(无显式转换)。您不能从一个void *>转换为另一种指针类型(无显式转换)。您不能在 sizeof 表达式、参数列表或返回类型中声明类型。如果您跳转会跳过带有初始化器的声明,则不能跳转到复合语句。即使您不使用“结果”,也不能从非 void 函数返回一个没有值。您不能递归调用 'main'。

此外,您可能会在 C++ 中遇到不同的行为,因为:// 注释被识别;结构标签隐式声明为 typedef 名称;像 'int f()' 这样的声明是原型声明,表示函数不接受任何参数。
---

如果您所说的“不同语义”是指一个程序在 C 和 C++ 中都有效,但在每种语言下的含义不同,那么这方面的例子往往有点不太可能。在这样的场合下总是会出现的一个例子是

  int x = 2 //* Would anyone actually write this? */ 2
    ;

在 C++ 中将 x 设置为 2(因为 // 之后的所有内容都会消失),或者在 C 中设置为 1(因为只有 /*...*/ 会被处理)。

另一个例子是

  typedef int x;
  {
    struct x { int a, b; };
    printf ("%d\n", (int) sizeof (x));
  }

这在 C 中打印 sizeof(int)。在 C++ 中,struct 标签 'x' 会隐藏外部的 typedef,因此显示的是结构的大小——至少是 2*sizeof(int)。

祝好,
Richard