我有一个*.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):
对象指针可以显式转换为其他类型的对象指针。
指向对象类型的指针可以被转换为指向不同对象类型的指针。
这些指定可以将一种指针类型转换为另一种指针类型(然后可选地转换回)而不会产生任何后果。
该SOCKADDR_IN结构是用来存储地址的互联网地址族。此类的指针应由应用程序强制转换为struct sockaddr *,以与套接字函数一起使用。
由于此函数(bind
)是C标准库的一部分,因此内部发生的任何事情(特别是取消引用类型转换的指针)都不会具有未定义的行为。
要回答更一般的问题:
C和C ++是两种不同的语言。如果某些内容是用C而不是C ++定义的,那么它是用C而不是C ++定义的。两种语言之间的隐含兼容性不会改变这一点。如果要使用在C中定义良好但在C ++中未定义的代码,则必须使用C编译器来编译该代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句