(void) fputs( line, stdout );
(void) alarm( TIMEOUT );
上述代码出现在函数体中,我以前从未见过这样的代码...
(void) fputs( line, stdout );
(void) alarm( TIMEOUT );
上述代码出现在函数体中,我以前从未见过这样的代码...
这是一种以牺牲人类阅读代码为代价、面向调试工具编写代码的形式,被认为是有害的。特别地,经典工具 lint
以及某些编译器会在你没有使用返回值的函数中生成警告,而本地抑制此警告的唯一方法是将结果强制转换为 void
。
如果您有足够的权限,可以忽略它或修复它(删除无用的 void
转换)。
(void)
的意思是“我知道这个函数会返回一个值,但我明确决定不需要它”。例如,alarm()
返回任何先前设置的警报剩余时间,你可能真的不在乎。加上(void)
前缀表示我已经考虑了alarm()
返回一个值,但我不想要它。类似地,对于fputs()
也是如此,但fputs()
可能会失败,所以使用fputs()
时就意味着“我要忽略错误”,这明显是不好的。 - JeremyPfputs
时,你可以在整个写操作结束时更容易地检查 ferror
,而不是不断检查 fputs
的返回值,这样可以得到更简单的代码(因此更不容易出现错误)。我认为你没有必要明确表明你没有使用返回值。从阅读代码中可以清楚地看出你没有使用它的事实。 - R.. GitHub STOP HELPING ICEstdio
中检查单个输出函数的错误返回通常是没有意义的,因为直到缓冲区已满且刷新失败时才会遇到错误。考虑到这一点,最好在结尾处简单地检查ferror
。 - R.. GitHub STOP HELPING ICEvoid
不在那里,不是一样的吗? - kernvoid
,而且是的,没有转换代码也具有完全相同的含义。一些编译器或工具可能会在没有转换的情况下发出警告。 - Ernest Friedman-Hill(void)
部分,那就是明确丢弃函数调用结果。 fputs(...)
返回一个 int
。(void) fputs(...)
会丢弃 int
的返回值而不会生成编译器警告。
(void)
部分是指什么? - Etienne de Martel