特定 sockaddr_in 变量名出现意外编译错误
Unexpected compile error on specific sockaddr_in variable name
作为接收 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;
};
};
当你遇到这样的错误时,它几乎总是意味着 header,在这种情况下可能是系统 header 之一,定义了一个与你同名的宏为您的变量选择,但扩展作为标识符无效。
如果 header 定义为:
,则不会出现问题
#define ifr_addr pwr_address
如果如您在 comment 中指出的那样,扩展(在 include/uapi/linux/if.h
中,第 258 行附近)是:
#define ifr_addr ifr_ifru.ifru_addr
该宏旨在更轻松地访问联合的元素,而无需每次都指定联合成员名称。在这样的时候,你会发现自己在问——这值得吗? (我在我每天工作的代码库中都看到了这一点——很多。有时很难弄清楚代码 正在 访问什么。)
尽管可以使用:
#undef ifr_addr
在使用该名称定义您自己的变量之前,这样做是如履薄冰。最好接受名称被抢占并使用其他名称,尽管这很烦人。一种可能性是使用 ifr_srcaddr
,到 match/contrast ifr_dstaddr
.
作为接收 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;
};
};
当你遇到这样的错误时,它几乎总是意味着 header,在这种情况下可能是系统 header 之一,定义了一个与你同名的宏为您的变量选择,但扩展作为标识符无效。
如果 header 定义为:
,则不会出现问题#define ifr_addr pwr_address
如果如您在 comment 中指出的那样,扩展(在 include/uapi/linux/if.h
中,第 258 行附近)是:
#define ifr_addr ifr_ifru.ifru_addr
该宏旨在更轻松地访问联合的元素,而无需每次都指定联合成员名称。在这样的时候,你会发现自己在问——这值得吗? (我在我每天工作的代码库中都看到了这一点——很多。有时很难弄清楚代码 正在 访问什么。)
尽管可以使用:
#undef ifr_addr
在使用该名称定义您自己的变量之前,这样做是如履薄冰。最好接受名称被抢占并使用其他名称,尽管这很烦人。一种可能性是使用 ifr_srcaddr
,到 match/contrast ifr_dstaddr
.