Visual c++ 结构的全局初始化

Visual c++ 结构的全局初始化,visual-c++,struct,initialization,global-variables,Visual C++,Struct,Initialization,Global Variables,如何在中全局初始化结构sockaddr\u。_ADDR sin_ADDR中的第三个变量是嵌套结构 struct sockaddr_in{ short sin_family; unsigned short sin_port; IN_ADDR sin_addr; char sin_zero[8]; } addr; struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;

如何在中全局初始化结构sockaddr\u。_ADDR sin_ADDR中的第三个变量
是嵌套结构

struct sockaddr_in{
   short sin_family;
   unsigned short sin_port;
   IN_ADDR sin_addr;
   char sin_zero[8];
} addr;

struct in_addr {
   union {
      struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
      struct { u_short s_w1,s_w2; } S_un_w;
      u_long S_addr;
   } S_un;
};

第1点

不能在
本身中初始化结构sockaddr\u。您需要具有此类型的变量,即,
addr
(与您的情况相同),您可以对其进行初始化

第2点

可以使用大括号括起来的INilizer列表初始化全局变量。此外,还可以使用
.identifier
选项显式初始化成员

假设地址中的
定义为

typedef struct sockaddr_in IN_ADDR;
你可以这样写

struct sockaddr_in{
   short sin_family;
   unsigned short sin_port;
   IN_ADDR sin_addr;
   char sin_zero[8];
} addr = {AF_INET, 2015, .sin_addr.S_un.S_addr = 1234567890, .sin_zero = {1,2,3,4,5,6,7}};
初始化
addr


这里,
.sin\u addr.S\u un.S\u addr
用于表示要初始化的特定变量。

使用您的结构/联合定义。。。这里是一个示例程序

#include <stdio.h>

typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned long u_long;

typedef struct in_addr
{
        union
        {
                struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
                struct { u_short s_w1,s_w2; } S_un_w;
                u_long S_addr;
        }S_un;
}IN_ADDR;

IN_ADDR u =  // ====> Either do something like this ...
{
        .S_un.S_un_b = {'a', 'b', 'c', 'd'}
        //.S_un.S_un_w = {1, 2},
        //.S_un.S_addr = 121212
};

struct sockaddr_in
{
        short sin_family;
        unsigned short sin_port;
        IN_ADDR sin_addr;
        char sin_zero[8];
}addr = { // ==============> Or do something like this.
                10,
                20,
                .sin_addr.S_un.S_addr=12345,
                "SOCKET"
        };


int main()
{
        printf("sin_family = %d\n", addr.sin_family);
        printf("sin_port = %d\n", addr.sin_port);
        printf("sin_addr.S_un.S_addr = %ld\n", addr.sin_addr.S_un.S_addr);
        printf("sin_zero = %s\n", addr.sin_zero);


        printf("%c %c %c %c\n", u.S_un.S_un_b.s_b1, u.S_un.S_un_b.s_b2, u.S_un.S_un_b.s_b3, u.S_un.S_un_b.s_b4);
        //printf("%d %d\n", u.S_un.S_un_w.s_w1, u.S_un.S_un_w.s_w2);
        //printf("%ld\n", u.S_un.S_addr);

        return 0;
}
#包括
typedef无符号字符u_字符;
typedef无符号短u_短;
typedef unsigned long uu long;
地址中的typedef结构
{
协会
{
结构{u_char s_b1,s_b2,s_b3,s_b4;}s_un_b;
结构{u_short s_w1,s_w2;}s_un_w;
u_long S_addr;
}苏恩;
}地址:;
在_addru=/=>中,可以这样做。。。
{
.S_un.S_un_b={'a','b','c','d'}
//S_un.S_un w={1,2},
//.S_un.S_addr=121212
};
结构sockaddr\u in
{
小仙姑家族;
无符号短sinu端口;
IN_ADDR sin_ADDR;
char sin_zero[8];
}地址={/===================>或执行类似操作。
10,
20,
.sin_addr.S_un.S_addr=12345,
“插座”
};
int main()
{
printf(“sinu family=%d\n”,地址sinu family);
printf(“sin_端口=%d\n”,地址sin_端口);
printf(“sin_addr.S_un.S_addr=%ld\n”,addr.sin_addr.S_un.S_addr);
printf(“sinu zero=%s\n”,addr.sinu zero);
printf(“%c%c%c%c\n”、u.S\u u u u u u u b.S\u b1、u.S\u u u u u b.S\u b2、u.S\u u u u u u u u u u b.S\u b3、u.S\u u u u u u u u u b.S\u b4);
//printf(“%d%d\n”,u.S_un.S_un w.S_w1,u.S_un.S_un w.S_w2);
//printf(“%ld\n”,美国地址);
返回0;
}

我收到以下错误:1。错误C2059:语法错误:'.'2。错误C2059:语法错误:“}”3。错误C2143:语法错误:“.”4之前缺少“}”。错误C2143:语法错误:缺少“;”在"5"之前。错误C2143:语法错误:缺少“;”在'}' @ SaadRafey之前,<代码> >“IdAdDr< /Cuth>”定义了哪些结构?WiSoCK2.2.h,它将失败,因为C++指定的初始化器不支持您编译它作为<代码> C>代码>或<代码> C++ > /代码>?@ iCePACK,我在Visual Studio 2010中工作,并在DeViWS窗体中应用程序。将其编译为C++这是您的问题,下面给出了答案。它们都包括指定的初始值设定项,这是
C
中不支持的
C
功能。为了使用这些,您需要切换到
C
编译(在项目属性中查找)@icepack,当它在addr.sin\u family=AF\u INET类中初始化时,它为我工作;是的,这会起作用……它会因为C++的编译失败,因为不支持指定的初始化器。