c++ - 在 C 和 C++ 中都有效的代码在用每种语言编译时是否会产生不同的行为?

标签 c++ c

C 和 C++ 有很多差异,并非所有有效的 C 代码都是有效的 C++ 代码。
(“有效”是指具有定义行为的标准代码,即不是特定于实现/未定义/等)

在使用每种语言的标准编译器编译时,一段在 C 和 C++ 中都有效的代码是否会产生不同的行为?

为了让它成为一个合理/有用的比较(我正在尝试学习一些实际有用的东西,而不是试图在问题中找到明显的漏洞),让我们假设:

  • 与预处理器无关(这意味着没有使用 #ifdef __cplusplus、pragmas 等进行黑客攻击)
  • 任何实现定义的内容在两种语言中都是相同的(例如数字限制等)
  • 我们正在比较每个标准的合理最新版本(例如,C++98 和 C90 或更高版本)
    如果版本很重要,请提及每个版本产生不同的行为。

最佳答案

下面是一个示例,它利用了 C 和 C++ 中函数调用和对象声明之间的差异,以及 C90 允许调用未声明函数的事实:

#include <stdio.h>

struct f { int x; };

int main() {
    f();
}

int f() {
    return printf("hello");
}

在 C++ 中,这将不打印任何内容,因为创建和销毁了一个临时的 f,但在 C90 中,它将打印 hello,因为可以在未声明的情况下调用函数。

如果您想知道名称 f 被使用了两次,C 和 C++ 标准明确允许这样做,并且要创建一个对象,您必须说 struct f如果您需要结构,可以消除歧义;如果需要函数,则可以省略 struct

关于c++ - 在 C 和 C++ 中都有效的代码在用每种语言编译时是否会产生不同的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/579828/

相关文章:

c++ - 如何在不选择文件的情况下判断 QFileDialog 是否已关闭?

c++ - OpenCV 中心单应

C++:从图像的透明度创建多边形

c - 每种情况下 'x' 的值是多少?

c - 如何将 FILE* 数组传入函数

c - 在 Linux 机器上运行 C 代码时出现段错误(核心转储)

C++17 编译器不应该发现对未定义值的引用传递吗?

c++ - 与类成员变量一起使用的 Pimpl 习语

objective-c - ios objC回调调用方法

c - 为数组成员设置计时器