使用静态数组的初始化恒定结构对象
我最近遇到了下面的代码:使用静态数组的初始化恒定结构对象
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;
}
我理解的常数和静态的含义。 但我能够以这种粗糙的方式破译常量对象的静态初始化背后的逻辑。 请澄清这样做的原因或使用
file.c
似乎是一个C文件。在C使用static
有两层含义:
- 不在堆栈(例如,对于变量内部函数应当在功能的几个电话保持其价值)
- 从该模块不出口上(对于变量不得作为符号提供给连接器)
在这种情况下,它似乎是第二个。变量gaih
不得导出(链接器可见)static
,不得更改const
。没有什么原油。
但是为了进一步说明细节,需要完整的有效代码。它似乎是一个只有一个条目的结构数组的常量和静态初始化。变量g
只是一个指向这个单个条目的指针。
这个例子有一定的相似性,在nss.h
的struct gaih_addrtuple
这是用于gethostbyname
主机名和IP地址的链接列表。
全局变量gaih
被定义为static
,这意味着它是仅在当前文件中可见的,并且const
,这意味着它不能被修改一次初始化。
局部变量g
也被定义为const
,这意味着它不能被改变。它使用全局gaih
数组的地址进行初始化,因此可以将g
视为此上下文中的数组。
g
也可以传递给另一个函数,可能在不同的文件中。这允许在当前文件之外读取gaih
的内容,这将不会通过尝试直接引用gaih
而被允许。
什么是'int func {const struct gaih * g = gaih; ''?它肯定不是一个函数...它不会需要至少'int func(void){... return 0; }'使它在C编译? – ryyker
这是什么语言?如果这是C或C++,则应使用正确的语法。 – NathanOliver
它是用于获取网络中主机地址的C代码 – achoora
这不是合法代码。向我们显示正确的代码。 – Simple