【问题标题】:Global initialization of structure结构的全局初始化
【发布时间】:2015-07-30 21:14:19
【问题描述】:

如何全局初始化struct sockaddr_in。第三个变量IN_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;
};

【问题讨论】:

  • 你是编译成C还是C++?
  • @icepack 我在 Visual Studio 2010 中工作并开发一个 windows 表单应用程序并将其编译为 C++
  • 这是您对以下答案的问题。它们都包含指定初始化程序,这是C 不支持的C++ 功能。为了使用那些你需要切换到C编译(在项目属性中查找)
  • @icepack 在 addr.sin_family=AF_INET 等类中初始化时对我有用;
  • 是的,可以。

标签: visual-c++ struct initialization global-variables


【解决方案1】:

第 1 点

你不能初始化struct sockaddr_in 本身。您需要有一个可以初始化的这种类型的变量,即addr(如您的情况)。

第 2 点

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

假设IN_ADDR被定义为

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_addr.S_un.S_addr 用于表示要初始化的特定变量。

【讨论】:

  • 我收到以下错误:1。错误 C2059:语法错误:“。” 2. 错误 C2059:语法错误:'}' 3. 错误 C2143:语法错误:在 '.' 之前缺少 '}' 4.错误C2143:语法错误:缺少';'前 '。' 5.错误C2143:语法错误:缺少';'在'}'之前
  • @SaadRafey IN_ADDR 是如何定义的?
  • @Saurav Ghosh 这些结构被定义为 winsock2.h
  • ...C++ 编译会失败,因为不支持指定的初始化程序
【解决方案2】:

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

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

【讨论】:

  • ...C++ 编译会失败,因为不支持指定的初始化程序
猜你喜欢
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多