使用静态数组初始化常量struct对象

时间:2016-01-13 12:56:59

标签: c linux networking

我最近遇到了以下代码:

    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;    

    }    

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

2 个答案:

答案 0 :(得分:1)

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

  1. 不在堆栈上(例如,对于函数内部的变量,它们应该在函数的多次调用中保持它们的值)
  2. 不从此模块导出(对于不应作为符号提供给链接器的变量)
  3. 在这种情况下,它似乎是第二个。变量gaih不得导出(链接器可见)static,不得更改const。没有什么粗糙的。

    但为了澄清更多细节,将需要完整的有效代码。它似乎是一个只有一个条目的结构数组的常量和静态初始化。变量g只是指向此单个条目的指针。

    此示例与struct gaih_addrtuple中的nss.h有一些相似之处,gethostbyname是用于var tmp = Sizzle('h1'); tmp[0].innerHTML = "test"; 的主机名和IP地址的链接列表。

答案 1 :(得分:1)

全局变量gaih定义为static,这意味着它仅在当前文件中可见,const,这意味着一旦初始化它就无法修改。 / p>

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

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