如果未定义的C++行为符合 C 定义的行为,会发生什么情况?

What happens if undefined C++ behaviour meets C defined behaviour?

本文关键字:什么情况 C++ 未定义 如果 定义      更新时间:2023-10-16

我有一个*.cpp文件,我用C++(不是C编译器(编译。包含函数依赖于一个强制转换(见最后一行(,它似乎是用 C 定义的(如果我错了,请纠正!(,但对于这种特殊类型来说不是C++。

[...] C++ code [...]
struct sockaddr_in sa = {0};
int sockfd = ...;
sa.sin_family = AF_INET;
sa.sin_port = htons(port);
bind(sockfd, (struct sockaddr *)&sa, sizeof sa);
[...] C++ code [...]

由于我在C++文件中编译了它,这是现在定义的行为还是未定义的行为?或者我是否需要将其移动到*.c文件中,以使其成为定义的行为?

这在C++和C中都有定义。它不违反严格的别名规定,因为它不会取消引用生成的指针。

这是C++的引述(感谢@interjay和@VTT(,允许这样做:

对象指针可以显式转换为不同类型的对象指针。

这是来自 C 的引用(感谢 @StoryTeller(,它允许这样做:

指向对象类型的指针

可以转换为指向其他对象类型的指针。

它们指定可以将一种指针类型转换为另一种指针类型(然后可以选择转换回来(,而不会产生任何后果。

以下是POSIX的引述,允许这种特定情况:

sockaddr_in结构用于存储因特网地址族的地址。指向此类型的指针应由应用程序强制转换为结构 sockaddr *以用于套接字函数。

由于这个函数(bind(是C标准库的一部分,所以内部发生的任何事情(特别是取消引用类型转换的指针(都没有未定义的行为。


要回答更一般的问题:

C 和 C++ 是两种不同的语言。如果某物在 C 中定义,但在 C++ 中未定义,则在 C 中定义,但不在C++中定义。两种语言之间的任何隐含兼容性都不会改变这一点。如果要使用在 C 中明确定义但在 C++ 中未定义的代码,则必须使用 C 编译器来编译该代码。

从各自标准的角度来看,C 和 C++ 代码之间的调用都会调用未定义的行为,但大多数平台都指定了这样的事情。

在 C 或 C++ 标准的一部分和实现的文档一起定义或描述操作,但其他部分将其描述为 Undefined 的情况下,允许实现以最能满足客户需求的任何方式处理代码,或者 - 如果他们对客户需求漠不关心 - 他们认为合适的任何方式。 标准将此类事项视为其管辖范围之外的事实并不意味着对何时和/或如何期望声称适合各种目的的实现进行有意义的处理做出任何判断,但一些编译器维护者赞同它确实如此的神话。

相关文章: