Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化联合_C++_Ipv6 - Fatal编程技术网

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。是的,但在这两种情况下,您在内存中填充的字节都是相同的。这个联合只会给您带来语法糖。