2016-01-13 58 views
0

我最近遇到了下面的代码:使用静态数组的初始化恒定结构对象

static const struct gaih gaih[] = {  
#if defined __UCLIBC_HAS_IPV6__  
    { PF_INET6, gaih_inet },  
#endif  
    { PF_INET, gaih_inet },  
#if 0 
    { PF_LOCAL, gaih_local },  
#endif  
    { PF_UNSPEC, NULL }  
};  



    struct gaih {  
      int family;  
      int (*gaih)(const char *name, const struct gaih_service *service,  
        const struct addrinfo *req, struct addrinfo **pai);  
     };  


int func{  

const struct gaih *g = gaih;  

    }  

我理解的常数和静态的含义。 但我能够以这种粗糙的方式破译常量对象的静态初始化背后的逻辑。 请澄清这样做的原因或使用

+1

这是什么语言?如果这是C或C++,则应使用正确的语法。 – NathanOliver

+0

它是用于获取网络中主机地址的C代码 – achoora

+1

这不是合法代码。向我们显示正确的代码。 – Simple

回答

1

file.c似乎是一个C文件。在C使用static有两层含义:

  1. 不在堆栈(例如,对于变量内部函数应当在功能的几个电话保持其价值)
  2. 从该模块不出口上(对于变量不得作为符号提供给连接器)

在这种情况下,它似乎是第二个。变量gaih不得导出(链接器可见)static,不得更改const。没有什么原油。

但是为了进一步说明细节,需要完整的有效代码。它似乎是一个只有一个条目的结构数组的常量和静态初始化。变量g只是一个指向这个单个条目的指针。

这个例子有一定的相似性,在nss.hstruct gaih_addrtuple这是用于gethostbyname主机名和IP地址的链接列表。

1

全局变量gaih被定义为static,这意味着它是仅在当前文件中可见的,并且const,这意味着它不能被修改一次初始化。

局部变量g也被定义为const,这意味着它不能被改变。它使用全局gaih数组的地址进行初始化,因此可以将g视为此上下文中的数组。

g也可以传递给另一个函数,可能在不同的文件中。这允许在当前文件之外读取gaih的内容,这将不会通过尝试直接引用gaih而被允许。

+0

什么是'int func {const struct gaih * g = gaih; ''?它肯定不是一个函数...它不会需要至少'int func(void){... return 0; }'使它在C编译? – ryyker