c - 特定 sockaddr_in 变量名出现意外编译错误

标签 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

最佳答案

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

如果 header 定义了以下内容,您就不会看到问题:

#define ifr_addr pwr_address

如您在 comment 中所述,您确实会看到问题。 ,扩展(在 include/uapi/linux/if.h 中,靠近第 258 行)是:

#define ifr_addr ifr_ifru.ifru_addr

该宏旨在使访问 union 的元素变得更容易,而不必每次都指定 union 成员名称。在这样的时候,你会问自己——这值得吗? (我在日常工作的代码库中经常看到这一点。有时很难弄清楚代码正在访问什么内容。)

尽管可以使用:

#undef ifr_addr

在使用该名称定义自己的变量之前,这样做是如履薄冰。最好接受该名称被抢占并使用其他名称,尽管这很烦人。一种可能是使用 ifr_srcaddr 来匹配/对比 ifr_dstaddr

关于c - 特定 sockaddr_in 变量名出现意外编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54349212/

相关文章:

c - 距离幸福一步——我所有的输入都给出了正确的输出,但它仍然给出了错误的答案

c - 包装机操作麻烦

java - 何时选择 JMS API 而不是 UDP 套接字 API,反之亦然?

Java客户端从C服务器接收,但C服务器不从Java客户端接收

c - sockaddr.sin_port = 1337 与 "real"打开的端口不匹配

linux - accept() 失败时 sockaddr 的状态是什么

谁能解释这个输出(操作系统)?

c - 测试文件/目录是否只读

c++ - 如何找到哪个函数打开了套接字?