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

Should I add const to a file descriptor?

文件描述符的返回值总是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?该决定只影响您自己,因此是否要添加此类注释取决于您。

你也可以问同样的参数问题。您将它们标记为 const 吗? const不影响调用者,只影响函数体,所以用不用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);
    }
}

或者这个,没有额外的 consts?

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, &str[i], len - i);
    }
}