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/