【问题标题】:use of static array to initialize constant struct object使用静态数组初始化常量结构对象
【发布时间】:2016-01-13 12:56:58
【问题描述】:

我最近遇到了以下代码:

    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;    

    }    

我理解 constant 和 static 的含义。 但是我能够以如此粗略的方式破译常量对象的静态初始化背后的逻辑。 请说明这样做的原因或用途

【问题讨论】:

  • 这是什么语言?如果这是 C 或 C++,你应该使用正确的语法。
  • 这是用于获取网络中主机地址的C代码
  • 这不是合法代码。向我们展示正确的代码。
  • 这是一个工作项目的一部分。我想说明我关于使用静态数组初始化常量结构对象的问题,这个代码部分就足够了。
  • 如果你想讨论一种语言的细节,你应该提供语法正确的代码。哪怕只是一个例子。否则很难区分简化和真正的句法错误。例如。结构的声明不需要=

标签: c linux networking


【解决方案1】:

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

  1. 不在堆栈上(例如,对于函数内部的变量,应在函数的多次调用中保持其值)
  2. 不从此模块导出(对于不应作为符号提供给链接器的变量)

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

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

此示例与nss.h 中的struct gaih_addrtuple 有一些相似之处,nss.h 是用于gethostbyname 的主机名和 IP 地址的链接列表。

【讨论】:

    【解决方案2】:

    全局变量gaih定义为static,表示只在当前文件中可见,const,表示一旦初始化就不能修改。

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

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

    【讨论】:

    • int func{ const struct gaih *g = gaih; } 是什么?它当然不是一个函数……至少不需要int func(void){...return 0; } 就可以使它在C 中编译吗?
    猜你喜欢
    • 2011-06-04
    • 2012-08-18
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2014-10-07
    • 1970-01-01
    • 2013-09-22
    相关资源
    最近更新 更多