【发布时间】:2011-05-18 13:03:35
【问题描述】:
(void) fputs( line, stdout );
(void) alarm( TIMEOUT );
上面出现在函数体中,我从来没见过这样的代码……
【问题讨论】:
-
什么意思?
(void)部分? -
是的,什么时候有用?
标签: c coding-style
(void) fputs( line, stdout );
(void) alarm( TIMEOUT );
上面出现在函数体中,我从来没见过这样的代码……
【问题讨论】:
(void) 部分?
标签: c coding-style
这是一种对调试工具进行编码的形式,以牺牲人类阅读您的代码为代价,而且它被认为是有害的。特别是经典的lint 工具,如果你不使用返回值的函数的返回值,可能还有一些编译器会生成警告,而在本地抑制这种情况的唯一方法是将结果转换为void。
如果你有足够的权限,要么忽略它,要么修复它(删除无用的void 演员表)。
【讨论】:
(void) 的意思是“我知道这会返回一个值,但我已经明确决定我不需要它”。例如alarm() 将剩余时间返回到您可能并不真正关心的任何先前设置的警报。用(void) 前缀表示我认为alarm() 返回一个值,但我不想要它。 fputs() 也类似,但 fputs() 可能会失败,所以 fputs() 你会说“我将忽略错误”,这显然很糟糕。
fputs,您可以更轻松地在整个写入操作结束时检查ferror,而不是不断检查fputs 的返回值,从而生成更简单的代码(因此不太可能包含错误)。我认为您没有理由明确说明您没有使用返回值这一事实。从阅读代码中可以明显看出您没有使用它的简单事实。
stdio 中各个输出函数的错误返回通常是没有意义的,因为直到很久以后当缓冲区已满并且刷新失败时您才会遇到错误。考虑到这一点,简单地检查最后的ferror 会更有意义。
唯一不寻常的是void 的演员表。这是一种表示您将忽略函数的返回值或表示函数不返回值的方法。一些编译器警告忽略的返回值,因此可以解决该警告。我个人认为这不是很好的风格。
【讨论】:
void不存在不也一样吗?
void 的转换,是的,没有转换的代码具有完全相同的含义。一些编译器或工具可能会在没有强制转换的情况下发出警告。
如果您的意思是(void) 部分,那么这就是明确丢弃函数调用的结果。 fputs(...) 返回一个 int。 (void) fputs(...) 丢弃 int 返回值而不生成编译器警告。
【讨论】: