上一个代码:
struct Inet_address{
char v4[4];
};
extern "C" Inet_address Inet_loopback =
{
{127,0,0,1}
};
修改后:
我让Inet_address成为一个联盟 这里的Inet地址是一个联合
union Inet_address{
char v4[4];
char v6[16];
};
现在我想对extern“C”Inet_address Inet_loopback执行相同的操作 说,
extern "C" Inet_address Inet_loopback =
{
if(some condition)
{127,0,0,1} //It should be Inet_address.v4
else
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } //This should be Inet_address.v6
};
请提出正确的方法来解决这个问题,因为我在这里遇到错误。
答案 0 :(得分:5)
你不应该为此使用char数组 - 从in_addr
和in6_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)
答案 1 :(得分:2)
bdonlan的答案很好,但是如果你想要一些完全可移植的东西,请参阅getaddrinfo()。 (好吧,现代POSIX,无论如何。)
struct addrinfo hints = { 0 };
hints.ai_family = AF_INET6;
hints.ai_flags = AI_NUMERICHOST;
struct addrinfo *result = NULL;
getaddrinfo("::1", NULL, &hints, &result);
// result[0].ai_addr is now a pointer to the localhost IPv6 address as a sockaddr_in6
// struct.
freeaddrinfo(result);
答案 2 :(得分:1)
在我看来,拥有这样的联合是没有意义的,因为Inet_address
将占用内存中最大数组的大小。为什么你不使用一个16个元素的数组呢?此外,如果只能在运行时评估条件,则必须将初始化放在函数中。如果你的条件可以在编译期间进行评估,你可以尝试使用模板和元编程来实现,但它不会很简单,也可能难以理解。
你能告诉我们你的病情吗?
答案 3 :(得分:1)
由于您(显然是通过附加到此问题的标签判断)使用c ++进行此项目,因此您根本不应使用联合。 C使用联合作为一种原始多态。在c ++中,继承是可用的,并且是一种实现多态的更强大的方法。
我建议您使用一个小的继承层次结构: (注意:这是骨架代码,只是为了让您了解这可能如何工作)
class Inet_address
{
vector<int> _address;
public:
Inet_address();
virtual ~Inet_address();
// pure virtual function...special behavior implemented in sub classes
virtual vector<int> loopback() = 0;
}
class Inet_address_v4 : public Inet_address
{
public:
Inet_address_v4();
virtual ~Inet_address_v4();
// special behavior for v4
virtual vector<int> loopback();
}
class Inet_address_v6 : public Inet_address
{
public:
Inet_address_v6();
virtual ~Inet_address_v6();
// special behavior for v6
virtual vector<int> loopback();
}
int main()
{
// Create a new v4 address object
Inet_address* my_v4_addr = new Inet_address_v4();
// Create a new v6 address object
Inet_address* my_v6_addr = new Inet_address_v6();
vector<Inet_address*> addresses;
addresses.push_back( my_v4_addr );
addresses.push_back( my_v6_addr );
// The loopback function is called in the same way for both sub-classes
for( unsigned int i=0; i<addresses.size(); i++ )
{
Inet_address* curr_adr = addresses[i];
curr_addr->loopback();
}
return 0;
}
这种方法通常是c ++中使用的标准方法。这是一种非常强大的方法,因为它可以允许您创建许多不同类型的具有相似行为的对象,这些对象可以使用完全相同的函数调用进行操作。
有关c ++继承的概述,请参阅此内容:http://www.cplusplus.com/doc/tutorial/inheritance/
祝你好运!