You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言报错:invalid type argument of ‘->’ (have ‘fd_set’) 代码问题排查

搞定这个编译错误的关键在这里!

嘿,你的问题其实很典型——你给FD_ZERO、FD_SET这些宏传错参数类型了,导致编译器报出“invalid type argument of ‘->’”的错误。

问题根源

FD_ZERO、FD_SET这类用于操作文件描述符集的宏,要求传入的是指向fd_set的指针(也就是fd_set*),但你在代码里直接传了fd->read、fd->write这类fd_set类型的实例。

这些宏的内部实现会尝试对参数使用->运算符(比如访问fd_set的内部成员),而->只能用于指针类型,直接作用于fd_set实例自然会触发语法错误。

修复后的代码

只需要给所有FD_ZERO、FD_SET的参数加上取地址符&,把实例转换成指针就行,修改后的build_fds函数如下:

void build_fds(struct server *srv, struct descs *fd) {
    FD_ZERO(&fd->read);
    FD_SET(STDIN_FILENO, &fd->read);
    FD_SET(srv->sock, &fd->read);
    FD_ZERO(&fd->write);
    // there is smth to send, set up write_fd for server socket
    if (srv->len > 0) {
        FD_SET(srv->sock, &fd->write);
    }
    FD_ZERO(&fd->except);
    FD_SET(STDIN_FILENO, &fd->except);
    FD_SET(srv->sock, &fd->except);
}

再补个小知识点

举个例子,FD_ZERO的典型宏定义大概是这样的(不同系统细节可能有差异,但核心逻辑一致):

#define FD_ZERO(set) do { \
    size_t __i; \
    for (__i = 0; __i < FD_SETSIZE; ++__i) \
        ((fd_set *)(set))->fds_bits[__i / NFDBITS] &= ~(1U << (__i % NFDBITS)); \
} while (0)

你看,宏里会把传入的set强制转成fd_set*,然后用->访问内部的fds_bits数组。如果你传的是实例而非指针,这个强制转换就会生成一个无效指针,同时语法上也不允许对实例用->——这就是报错的直接原因。

最后提个小提醒:后续调用select()的时候,也要记得传递fd_set*类型的参数,同样要注意取地址哦!

内容的提问来源于stack exchange,提问作者Denis Steinman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:44:19