如何解决我应该将 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
?该决定只会影响您自己,因此是否要添加此类注释取决于您。
您也可以对参数提出同样的问题。您是否将它们标记为 const
? const
不会影响调用者,只会影响函数体,因此无论您是否使用它都不会影响 API。
大多数人不会为普通变量这样做。这是额外的输入,通常在 5 行或 10 行或 20 行的函数中很明显是否修改了变量。
例如,您是否更喜欢这样,将 str
、fd
和 len
标记为 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 举报,一经查实,本站将立刻删除。