我该如何处理从未使用过的值?

时间:2016-04-25 14:01:35

标签: c gcc posix compiler-warnings

我并不总是使用所有返回值,有时我必须处理返回值。例如:

$ 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 {}
}

4 个答案:

答案 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

希望这会有所帮助。如上所述,总是检查“写入”的值,错误会自动消失 :)