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

标签 c++ c

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

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

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

  • 没有与预处理器相关的东西(这意味着没有 #ifdef __cplusplus、pragma 等的 hack)
  • 任何实现定义的内容在两种语言中都是相同的(例如数字限制等)
  • 我们正在比较每个标准的最新版本(例如,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/12887700/

相关文章:

c++ - 输入和输出迭代器

c++ - 用于 C/C++ 应用程序的开源 PDF 库?

c - 保留两个字符串的公共(public)前缀.....C编程...段错误错误

c++ - Boost.Graph 对 void 的引用

c# - 匹配从 C++ (crypto++) 到 c# 的加密

c++ - 使用默认构造函数和赋值重新初始化变量

c++ - 如何在与 boost 正则表达式匹配的字符串中找到索引?

c - 序列化二叉树?

c - 使用 fclose() 时出错

将 int 复制到不同的内存位置,接收比预期更多的字节