我应该将 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 行的函数中,变量是否被修改通常很明显。
例如,您喜欢这个吗,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
s?
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);
}
}
文件描述符的返回值总是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
s?
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);
}
}