如果未定义的C ++行为满足C定义的行为会发生什么?

丹尼尔·斯蒂芬斯(Daniel Stephens)

我有一个*.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文件以使其定义为行为?

SS安妮

这是在C ++和C中定义的。它不违反严格的别名规定,因为它不会取消对结果指针的引用。

这是来自C ++引号(感谢@interjay和@VTT):

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

这是C引号(感谢@StoryTeller),允许这样做:

指向对象类型的指针可以被转换为指向不同对象类型的指针。

这些指定可以将一种指针类型转换为另一种指针类型(然后可选地转换回)而不会产生任何后果。

这是POSIX报价,允许这种特定情况:

SOCKADDR_IN结构是用来存储地址的互联网地址族。此类的指针应由应用程序强制转换struct sockaddr *,以与套接字函数一起使用。

由于此函数(bind)是C标准库的一部分,因此内部发生的任何事情(特别是取消引用类型转换的指针)都不会具有未定义的行为。


要回答更一般的问题:

C和C ++是两种不同的语言。如果某些内容是用C而不是C ++定义的,那么它是用C而不是C ++定义的。两种语言之间的隐含兼容性不会改变这一点。如果要使用在C中定义良好但在C ++中未定义的代码,则必须使用C编译器来编译该代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++的sprintf删除未定义的行为

来自分类Dev

C联合和未定义的行为

来自分类Dev

为什么C中允许未定义的行为

来自分类Dev

如果C ++的atoi()允许未定义的行为,如何保证不引发异常?

来自分类Dev

未定义的行为

来自分类Dev

C / C ++联合和未定义的行为

来自分类Dev

C / C ++中的链接分配是未定义的行为吗?

来自分类Dev

如果变量未定义

来自分类Dev

红宝石a = b || 如果b未定义,则为c

来自分类Dev

为什么这是未定义的行为?

来自分类Dev

为什么有些事情在C ++中留下未定义的行为?如果其中一些在标准中预定义会更好吗?

来自分类Dev

sum +++ i是C中未定义的行为吗?

来自分类Dev

C ++异常,未定义行为和noexcept

来自分类Dev

C ++:函数重新声明是未定义的行为吗?

来自分类Dev

在C中被零除和未定义的行为

来自分类Dev

未定义的行为,其中:c =(b = a + 2)-(a = 1);

来自分类Dev

如何检查c中未定义行为?

来自分类Dev

C中的虚拟继承示例,利用未定义的行为?

来自分类Dev

C中潜在的未定义行为

来自分类Dev

C ++指针怪异的未定义行为

来自分类Dev

C ++中的签名溢出和未定义的行为(UB)

来自分类Dev

是(a = 1)= 2在C ++ 98中未定义的行为吗?

来自分类Dev

减去指针时的C ++未定义行为

来自分类Dev

未定义的行为在C中串联字符串

来自分类Dev

C ++类型索引哈希导致未定义的行为

来自分类Dev

这也是Ansi C中未定义的行为吗?

来自分类Dev

sum +++ i是C中未定义的行为吗?

来自分类Dev

C ++ istream :: read导致未定义的行为

来自分类Dev

C中潜在的未定义行为