特定sockaddr_in变量名

时间:2019-01-24 14:43:30

标签: c sockets sockaddr-in

作为接收struct ifreq *ifr参数的函数的一部分,如果我声明struct sockaddr_in name;,则程序会编译,但是如果我将变量命名为struct sockaddr_in ifr_addr;,它将失败,并出现以下错误:

code.c:244:24: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
     struct sockaddr_in ifr_addr;
                        ^
code.c:244:24: error: expected expression before ‘.’ token
Makefile:2: recipe for target 'all' failed
make: *** [all] Error 1

ifreq结构声明如下。我知道该结构具有与问题变量同名的字段。在C语言中有什么问题?

       struct ifreq {
           char ifr_name[IFNAMSIZ]; /* Interface name */
           union {
               struct sockaddr ifr_addr;
               struct sockaddr ifr_dstaddr;
               struct sockaddr ifr_broadaddr;
               struct sockaddr ifr_netmask;
               struct sockaddr ifr_hwaddr;
               short           ifr_flags;
               int             ifr_ifindex;
               int             ifr_metric;
               int             ifr_mtu;
               struct ifmap    ifr_map;
               char            ifr_slave[IFNAMSIZ];
               char            ifr_newname[IFNAMSIZ];
               char           *ifr_data;
           };
       };

http://man7.org/linux/man-pages/man7/netdevice.7.html

1 个答案:

答案 0 :(得分:1)

当您收到这样的错误时,它几乎总是意味着标头(在这种情况下,可能是系统标头之一)已定义了一个宏,该宏的名称与您为变量选择的名称相同,但扩展名为无效作为标识符。

如果标头定义,您不会看到任何问题

#define ifr_addr pwr_address

如您在comment中所指出的那样,扩展名(在include/uapi/linux/if.h中,靠近第258行)是:

#define ifr_addr ifr_ifru.ifru_addr

该宏旨在使访问联合的元素变得更加容易,而不必每次都指定联合成员名称。在这样的时候,您会问自己-值得吗? (我在日常工作的代码库中看到了这一点-很多。有时很难确定 正在访问的代码。)

尽管可以使用:

#undef ifr_addr

在使用该名称定义自己的变量之前,要先行一步。最好接受名称被抢占并使用其他名称,尽管名称令人讨厌。一种可能是使用ifr_srcaddr来匹配/对比ifr_dstaddr