微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我应该将 const 添加到文件描述符吗?

如何解决我应该将 const 添加到文件描述符吗?

文件描述符的返回值总是int类型,例如:

// posix socket
int socket(int domain,int type,int protocol);
// posix open
int open(const char *pathname,int flags);

返回的文件描述符不应该改变(?),所以我认为返回的文件描述符的类型应该添加const,例如:

const int fd = open("/dev/uio1",O_RDWR);

但我读了很多示例代码,事实并非如此。

那么文件描述符的类型应该是int而不是const int吗?

解决方法

如果您愿意,并且它对您的代码有意义,您可以声明它 const

确实不是很常见,可能是因为不小心修改了这样的变量并不是很常见的错误,所以人们不会费心去采取措施来避免它。

修改包含文件描述符的 int 变量并没有本质上的错误。一个例子可能是这样的

int fd;
fd = open(first_file,O_RDONLY);
process_data(fd);
if (file_ended) {
    close(fd);
    fd = open(next_file,O_RDONLY);
}
process_more_data(fd);
close(fd);

当然,为了避免泄露 fd,您应该确保在覆盖最后一个剩余副本之前 close() 它。

,

这通常是针对所有局部变量的问题,而不仅仅是文件描述符。如果所有局部变量在初始化后从未更改,您是否将它们标记为 const?该决定只会影响您自己,因此是否要添加此类注释取决于您。

您也可以对参数提出同样的问题。您是否将它们标记为 constconst 不会影响调用者,只会影响函数体,因此无论您是否使用它都不会影响 API。

大多数人不会为普通变量这样做。这是额外的输入,通常在 5 行或 10 行或 20 行的函数中很明显是否修改了变量。

例如,您是否更喜欢这样,将 strfdlen 标记为 const

void silly(const char *const str) {
    const int fd = open("/dev/uio1",O_RDWR);
    const int len = strlen(str);

    for (int i = 0; i < len; i++) {
        write(fd,&str[i],len - i);
    }
}

或者这个,没有额外的const

void silly(const char *str) {
    int fd = open("/dev/uio1",O_RDWR);
    int len = strlen(str);

    for (int i = 0; i < len; i++) {
        write(fd,len - i);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。