我并不总是使用所有返回值,有时我必须处理返回值。例如:
$ 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
我应该怎么做以避免警告?是否有一种很好的方式来使用"一个变量,比如将它写入/dev/null
,以便编译器不会抱怨?我自己的想法是这个,它处理问题而不忽略错误,我可以在没有警告的情况下提交我的代码并稍后处理:
void int_handler(int signum) {
if (write(fileno(stdin), s, sizeof s - 1)) {
} else {}
}
答案 0 :(得分:3)
通常要禁止此警告,您可以执行以下操作:
(void)write(fileno(stdin), s, sizeof s - 1);
但警告的原因是因为write()
声明了标题中的属性(<unistd.h>
),这会导致警告。
这个(属性)不是针对每个功能而是选择性地完成的。例如,printf()
的返回通常会被忽略。
因为,您需要检查IO操作的结果,它是为write()
完成的。
因此,如果您真的想忽略结果,可以使用(void)func(...);
来抑制此结果。
答案 1 :(得分:2)
首先,如果生产质量代码中的文件处理函数,您几乎肯定会处理所有返回值。
否则,忽略变量或函数结果的标准方法是将其强制转换为(void)
。
答案 2 :(得分:2)
不考虑对write
的调用的返回值是一个坏主意,因为I / O可能会失败,因此处理此类事件非常重要。如果您确实要删除警告,则应明确忽略返回值:
(void)write(...);
答案 3 :(得分:1)
头文件unistd.h中写入的原型已声明如下
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开启进行编译时,将被定义为 __attribute_warn_unused_result 即可。如果不使用函数的返回值,该属性实质上告诉编译器抛出警告。
您可以将stdout和stderr重定向到/ dev / null
gcc -c file.c > /dev/null 2>&1
并删除警告(尽管错误被重定向到null)或者您可以重定向到文件
gcc -c warn.c > xx 2>&1
希望这会有所帮助。如上所述,总是检查“写入”的值,错误会自动消失 :)