Dan*_*ens 10 c c++ undefined-behavior
我有一个*.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 [...]
Run Code Online (Sandbox Code Playgroud)
由于我将其编译为C ++文件,因此这是现在定义的还是未定义的行为?还是我需要将其移动到*.c文件中以使其定义为行为?
这是在C ++和C中定义的。它不违反严格的别名规定,因为它不会取消对结果指针的引用。
这是C ++的引号(感谢@interjay和@VTT),它允许这样做:
可以将对象指针显式转换为其他类型的对象指针。
这是C的引号(感谢@StoryTeller),它允许这样做:
指向对象类型的指针可以转换为指向不同对象类型的指针。
这些指定可以将一种指针类型转换为另一种指针类型(然后可选地转换回)而不会产生任何后果。
该SOCKADDR_IN结构是用来存储地址的互联网地址族。此类的指针应由应用程序强制转换为struct sockaddr *以与套接字函数一起使用。
由于此函数(bind)是C标准库的一部分,因此内部发生的任何事情(具体而言,取消引用类型转换的指针)都不会具有未定义的行为。
要回答更一般的问题:
C和C ++是两种不同的语言。如果某些东西是用C而不是C ++定义的,那么它是用C而不是C ++定义的。两种语言之间的隐含兼容性不会改变这一点。如果要使用在C中定义良好但在C ++中未定义的代码,则必须使用C编译器来编译该代码。