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

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" 的值,错误会自动消失 :)