我应该如何处理从未使用过的值?
How should I handle a value that is never used?
我并不总是使用所有 return 值,有时我必须处理 return 值。例如:
$ make
gcc -pedantic -std=c99 -Wall -O3 -ledit -g -DVERSION=\"v0.160425-2-gc443\" -c -o main.o main.c
main.c: In function ‘int_handler’:
main.c:532:5: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result]
write(fileno(stdin), s, sizeof s - 1);
^
gcc -o shell main.o errors.c util.c pipeline.c -ledit
我应该怎么做才能避免警告?有没有什么好方法可以 "use" 一个变量,比如将它写入 /dev/null
,这样编译器就不会报错了?我自己的想法是这样的,它在不忽略错误的情况下处理问题,我可以在没有警告的情况下提交我的代码并稍后处理:
void int_handler(int signum) {
if (write(fileno(stdin), s, sizeof s - 1)) {
} else {}
}
通常要抑制此警告,您可以执行以下操作:
(void)write(fileno(stdin), s, sizeof s - 1);
但出现警告的原因是因为 write()
是在 header (<unistd.h>
) 中使用导致警告的属性声明的。
这个(属性)不是针对每个函数做的,而是有选择地做的。例如,printf()
的 return 通常会被忽略。
因为,您想要检查 IO 操作的结果,它已完成 write()
。
所以,如果你真的想忽略这个结果,你可以使用 (void)func(...);
来抑制它。
首先,对于生产质量代码中的文件处理函数,您几乎肯定应该处理所有 return 值。
否则,忽略变量或函数结果的标准方法是将其转换为 (void)
。
不考虑调用 write
的 return 值是个坏主意,因为 I/O 可能会失败,所以处理这样的问题很重要事件。如果你真的想删除警告,你应该明确忽略 return 值:
(void)write(...);
头文件unistd.h中write的原型声明如下
extern ssize_t write (int __fd, const void *__buf, size_t __n) __wur
和 __wur 已定义为(在 cdefs.h 中)
# if __USE_FORTIFY_LEVEL > 0
# define __wur __attribute_warn_unused_result__
# endif
#else
# define __attribute_warn_unused_result__ /* empty */
因此,当您在启用 fortify 开关的情况下进行编译时,wur 被定义为
__attribute_warn_unused_result。如果未使用函数的 return 值,此属性实质上告诉编译器抛出警告。
您可以将 stdout 和 stderr 重定向到 /dev/null
gcc -c file.c > /dev/null 2>&1
并消除警告(即使错误被重定向到 null)或者您可以重定向到文件 as
gcc -c warn.c > xx 2>&1
希望这对您有所帮助。就像上面说的,总是检查 "write" 的值,错误会自动消失
:)
我并不总是使用所有 return 值,有时我必须处理 return 值。例如:
$ make
gcc -pedantic -std=c99 -Wall -O3 -ledit -g -DVERSION=\"v0.160425-2-gc443\" -c -o main.o main.c
main.c: In function ‘int_handler’:
main.c:532:5: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result]
write(fileno(stdin), s, sizeof s - 1);
^
gcc -o shell main.o errors.c util.c pipeline.c -ledit
我应该怎么做才能避免警告?有没有什么好方法可以 "use" 一个变量,比如将它写入 /dev/null
,这样编译器就不会报错了?我自己的想法是这样的,它在不忽略错误的情况下处理问题,我可以在没有警告的情况下提交我的代码并稍后处理:
void int_handler(int signum) {
if (write(fileno(stdin), s, sizeof s - 1)) {
} else {}
}
通常要抑制此警告,您可以执行以下操作:
(void)write(fileno(stdin), s, sizeof s - 1);
但出现警告的原因是因为 write()
是在 header (<unistd.h>
) 中使用导致警告的属性声明的。
这个(属性)不是针对每个函数做的,而是有选择地做的。例如,printf()
的 return 通常会被忽略。
因为,您想要检查 IO 操作的结果,它已完成 write()
。
所以,如果你真的想忽略这个结果,你可以使用 (void)func(...);
来抑制它。
首先,对于生产质量代码中的文件处理函数,您几乎肯定应该处理所有 return 值。
否则,忽略变量或函数结果的标准方法是将其转换为 (void)
。
不考虑调用 write
的 return 值是个坏主意,因为 I/O 可能会失败,所以处理这样的问题很重要事件。如果你真的想删除警告,你应该明确忽略 return 值:
(void)write(...);
头文件unistd.h中write的原型声明如下
extern ssize_t write (int __fd, const void *__buf, size_t __n) __wur
和 __wur 已定义为(在 cdefs.h 中)
# if __USE_FORTIFY_LEVEL > 0
# define __wur __attribute_warn_unused_result__
# endif
#else
# define __attribute_warn_unused_result__ /* empty */
因此,当您在启用 fortify 开关的情况下进行编译时,wur 被定义为 __attribute_warn_unused_result。如果未使用函数的 return 值,此属性实质上告诉编译器抛出警告。
您可以将 stdout 和 stderr 重定向到 /dev/null
gcc -c file.c > /dev/null 2>&1
并消除警告(即使错误被重定向到 null)或者您可以重定向到文件 as
gcc -c warn.c > xx 2>&1
希望这对您有所帮助。就像上面说的,总是检查 "write" 的值,错误会自动消失 :)