初始化联合

时间:2011-05-24 18:29:49

标签: c++ ipv6

上一个代码:

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
};

请提出正确的方法来解决这个问题,因为我在这里遇到错误。

4 个答案:

答案 0 :(得分:5)

你不应该为此使用char数组 - 从in_addrin6_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/

祝你好运!