这是c语言中的什么编码风格?

5
(void) fputs( line, stdout );
(void) alarm( TIMEOUT );

上述代码出现在函数体中,我以前从未见过这样的代码...


你的意思是什么?(void) 部分是指什么? - Etienne de Martel
是的,那有什么用处? - kern
3个回答

10

这是一种以牺牲人类阅读代码为代价、面向调试工具编写代码的形式,被认为是有害的。特别地,经典工具 lint 以及某些编译器会在你没有使用返回值的函数中生成警告,而本地抑制此警告的唯一方法是将结果强制转换为 void

如果您有足够的权限,可以忽略它或修复它(删除无用的 void 转换)。


2
我一直认为(void)的意思是“我知道这个函数会返回一个值,但我明确决定不需要它”。例如,alarm()返回任何先前设置的警报剩余时间,你可能真的不在乎。加上(void)前缀表示我已经考虑了alarm()返回一个值,但我不想要它。类似地,对于fputs()也是如此,但fputs()可能会失败,所以使用fputs()时就意味着“我要忽略错误”,这明显是不好的。 - JeremyP
1
从我的经验来看,至少有一半的时间你不需要使用库函数的返回值,而忽略它们并不意味着忽略错误。例如,在使用 fputs 时,你可以在整个写操作结束时更容易地检查 ferror,而不是不断检查 fputs 的返回值,这样可以得到更简单的代码(因此更不容易出现错误)。我认为你没有必要明确表明你没有使用返回值。从阅读代码中可以清楚地看出你没有使用它的事实。 - R.. GitHub STOP HELPING ICE
3
@JeremyP: R.的意思是通常这是为了工具而不是为了阅读代码的人的利益。请参阅http://gcc.gnu.org/onlinedocs/gcc/Non_002dbugs.html以了解GCC不会将警告设置为忽略返回值的默认选项的原因:“对这种做法的警告只会导致防御性程序员在程序中添加大量的void类型转换。这些转换是如此频繁,以至于它们成为视觉噪音。编写这些转换变得如此自动化,以至于它们不再传达有用的关于程序员意图的信息。” - Michael Burr
顺便提一下,在stdio中检查单个输出函数的错误返回通常是没有意义的,因为直到缓冲区已满且刷新失败时才会遇到错误。考虑到这一点,最好在结尾处简单地检查ferror - R.. GitHub STOP HELPING ICE

4
唯一不寻常的是对 void 的转换。 它是一种表示您将忽略函数的返回值或者表示函数没有返回值的方法。 一些编译器会警告忽略的返回值,所以可以使用这种方式来解决警告。 我个人认为这样做并不是很好的风格。

如果 void 不在那里,不是一样的吗? - kern
1
是的,这只是一个转换为void,而且是的,没有转换代码也具有完全相同的含义。一些编译器或工具可能会在没有转换的情况下发出警告。 - Ernest Friedman-Hill

1
如果您说的是 (void) 部分,那就是明确丢弃函数调用结果。 fputs(...) 返回一个 int(void) fputs(...) 会丢弃 int 的返回值而不会生成编译器警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接