C++ 初始化联合
以前的代码:C++ 初始化联合,c++,ipv6,C++,Ipv6,以前的代码: struct Inet_address{ char v4[4]; }; extern "C" Inet_address Inet_loopback = { {127,0,0,1} }; 修改后: 我让你在一个工会上发言 这里的Inet地址是一个联合体 union Inet_address{ char v4[4]; char v6[16]; }; 现在我想对外部“C”Inet\u地址Inet\u环回执行相同的操作 说 请建议一种正确的方法来实现这一点,因为我在这里遇到了错误
struct Inet_address{
char v4[4];
};
extern "C" Inet_address Inet_loopback =
{
{127,0,0,1}
};
修改后:
我让你在一个工会上发言
这里的Inet地址是一个联合体
union Inet_address{
char v4[4];
char v6[16];
};
现在我想对外部“C”Inet\u地址Inet\u环回执行相同的操作
说
请建议一种正确的方法来实现这一点,因为我在这里遇到了错误。您不应该为此使用字符数组-将\u addr中的
和\u addr中的进行联合:
typedef union {
struct in_addr inaddr;
struct in6_addr in6addr;
} in46_addr_t;
要设置ipv4环回地址,请执行以下操作:
addr.inaddr.s_addr = INADDR_LOOPBACK;
对于IPv6:
addr.in6addr = in6addr_loopback; // pre-defined global variable (note: assumes linux socket API)
您不应该为此使用字符数组-将\u addr
中的和\u addr
中的组成一个并集:
typedef union {
struct in_addr inaddr;
struct in6_addr in6addr;
} in46_addr_t;
要设置ipv4环回地址,请执行以下操作:
addr.inaddr.s_addr = INADDR_LOOPBACK;
对于IPv6:
addr.in6addr = in6addr_loopback; // pre-defined global variable (note: assumes linux socket API)
在我看来,这样的联合是没有意义的,因为Inet\u address
将占用内存中最大数组的大小。为什么不只使用一个包含16个元素的数组?此外,如果只能在运行时评估条件,则必须将初始化放在函数中。如果您的条件可以在编译时进行评估,那么您尝试做的可能是使用模板和元编程实现的,但这并不简单,而且可能很难阅读
你能告诉我们更多关于你的情况吗?在我看来,有这样的联合是没有意义的,因为Inet\u address
会占用内存中最大数组的大小。为什么不只使用一个包含16个元素的数组?此外,如果只能在运行时评估条件,则必须将初始化放在函数中。如果您的条件可以在编译时进行评估,那么您尝试做的可能是使用模板和元编程实现的,但这并不简单,而且可能很难阅读
你能告诉我们更多关于你的情况吗?
< P>因为你(显然是用这个问题的标签来判断),这个项目用C++来做,你根本不应该使用一个联盟。C使用联合作为一种原始多态性。在C++中继承是可用的,是实现多态性的一种更健壮的方法。
我建议您为此使用小型继承继承权:
(注意:这是一个框架代码,只是为了让您了解它是如何工作的)
class Inet\u地址
{
矢量地址;
公众:
Inet_地址();
虚拟~Inet_地址();
//纯虚拟函数…在子类中实现的特殊行为
虚拟向量环回()=0;
}
类Inet\u address\u v4:公共Inet\u address
{
公众:
Inet_地址_v4();
虚拟~Inet_地址_v4();
//v4的特殊行为
虚拟向量环回();
}
类Inet\u地址\u v6:公共Inet\u地址
{
公众:
Inet_地址_v6();
虚拟~Inet_地址_v6();
//v6的特殊行为
虚拟向量环回();
}
int main()
{
//创建新的v4地址对象
Inet_地址*my_v4_addr=新Inet_地址_v4();
//创建新的v6地址对象
Inet_地址*my_v6_addr=新Inet_地址_v6();
矢量地址;
地址。推回(我的v4地址);
地址。推回(我的地址);
//两个子类的环回函数调用方式相同
对于(无符号整数i=0;i
好运!
因为你是(显然,用这个问题的标签来判断)这个项目,你不应该使用一个联合。C使用工会作为一种原始多态性。C++ C++继承是可用的,是一种更健壮的实现多态性的方法。
我建议您为此使用小型继承继承权:
(注意:这是一个框架代码,只是为了让您了解它是如何工作的)
class Inet\u地址
{
矢量地址;
公众:
Inet_地址();
虚拟~Inet_地址();
//纯虚拟函数…在子类中实现的特殊行为
虚拟向量环回()=0;
}
类Inet\u address\u v4:公共Inet\u address
{
公众:
Inet_地址_v4();
虚拟~Inet_地址_v4();
//v4的特殊行为
虚拟向量环回();
}
类Inet\u地址\u v6:公共Inet\u地址
{
公众:
Inet_地址_v6();
虚拟~Inet_地址_v6();
//v6的特殊行为
虚拟向量环回();
}
int main()
{
//创建新的v4地址对象
Inet_地址*my_v4_addr=新Inet_地址_v4();
//创建新的v6地址对象
Inet_地址*my_v6_addr=新Inet_地址_v6();
矢量地址;
地址。推回(我的v4地址);
地址。推回(我的地址);
//两个子类的环回函数调用方式相同
对于(无符号整数i=0;i
祝你好运!bdonlan的答案是好的,但是如果你想要一个完全便携的东西,请看。(好吧,无论如何,现代POSIX。)
bdonlan的答案是好的,但是如果你想要一个完全POSIX便携的东西,请看
extern“C”
不是C语言的一部分。@DeadMG…谢谢。事实上,我是新手。extern“C”
不是C语言的一部分。@DeadMG…谢谢。实际上我是新手。@neodelphi…我想用这个联合来设置IPV4和V6的环回地址。如果是IPV4,我想填充v4,如果是IPV6,我想填充V6。是的,但在这两种情况下,你在内存中填充的字节都是相同的。这个联合只会给你带来语法c sugar。@neodelphi…我想用这个联合来设置IPV4和V6的环回地址。如果是IPV4,我想填充v4,如果是IPV6,我想填充V6。是的,但在这两种情况下,您在内存中填充的字节都是相同的。这个联合只会给您带来语法糖。