C和C++有很多不同之处,并不是所有的有效C代码都是有效的C++代码。
(所谓“有效”是指具有已定义行为的标准代码,即非特定于实现/未定义/等)
是否有任何一种代码在C和C++中都有效,在用标准的编译器编译时,会产生不同的行为?
为了使之成为一个合理/有用的比较(我试图学习一些实际有用的东西,而不是试图找出问题中明显的漏洞),让我们假设:
- 与预处理器无关(这意味着没有对
\ifdef\uu cplusplus、pragmas等的攻击) - 在两种语言中定义的任何实现都是相同的(例如,数字限制等)
- 我们正在比较每个标准的合理最新版本(例如,C++98和C90或更高版本)
如果版本很重要,那么请说明每个版本的哪些版本会产生不同的行为
这是一个利用C和C++中函数调用和对象声明之间的区别的例子,以及C90允许调用未声明函数:
#包括<;标准h>;
结构f{int x;};
int main(){
f();
}
int f(){
返回printf(“你好”);
}
这将不会打印任何东西,因为临时的 f>代码>被创建和销毁,但是在C90中,它将打印 hello >代码>,因为函数可以在没有声明的情况下调用。
>如果你对名字“代码> F使用两次感到怀疑,C和C++标准明确地允许这个,并且如果你想要这个结构,就必须让一个对象“代码>结构SF f/CODE”来消除歧义,或者如果你想要函数,就不要使用结构> /代码>