pap*_*p42 10 c macros structure
在下面结构的定义中,有一个带有宏定义(#define
)的行.那条线究竟做了什么?我理解它是数组的第一个条目的别名h_addr_list
,但它看起来仍然很奇怪.是h_addr
结构的成员hostent
吗?这个定义只在结构范围内吗?
struct hostent
{
char *h_name; /* official name of host */
char **h_aliases; /* alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses from name server */
#define h_addr h_addr_list[0] /* address, for backward compatiblity */
};
Run Code Online (Sandbox Code Playgroud)
Mat*_*Mat 18
宏定义根本没有作用域,如果它在该结构之外定义,它将以相同的方式工作.
它允许旧代码继续使用hr.h_addr
而不必更改为he.h_addr_list[0]
(假设he
是a struct hostent
).
澄清h_addr
一下,不是一个领域struct hostent
.该定义由预处理器处理,实际编译器看到空行所在的#define
位置.
但如果编写一段代码he.h_addr
,预处理器将修改它并替换它he.h_addr_list[0]
.这就是实际编译器将看到的内容.
预处理器宏从不作用域:编译器本身甚至看不到它们 - 它只看到替换的结果,并且预处理器完全忽略(不知道)作用域.
一旦定义,宏标识符将独立于C作用域规则保持可见.其范围从其定义开始,直到翻译单元结束或相应的#undef
指令.
这里,结构内部的定义只是为了可读性; 您也可以在结构后定义宏,例如:
struct hostent
{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
};
#define h_addr h_addr_list[0]
Run Code Online (Sandbox Code Playgroud)
它根本不是一个领域; 它允许用户写s.h_addr
而不是s.h_addr_list[0]
.