在struct定义中定义宏

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].这就是实际编译器将看到的内容.

预处理器宏从不作用域:编译器本身甚至看不到它们 - 它只看到替换的结果,并且预处理器完全忽略(不知道)作用域.

  • `h_addr`不是`struct hostent`的字段.该定义由预处理器处理,实际编译器看到`#define`所在的空行.但是如果一段代码写成`he.h_addr`,预处理器将修改它并用`he.h_addr_list [0]`替换它.这就是实际编译器将看到的内容. (2认同)

md5*_*md5 6

一旦定义,宏标识符将独立于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].