【问题标题】:What is this kind of coding style in c?c中的这种编码风格是什么?
【发布时间】:2011-05-18 13:03:35
【问题描述】:
(void) fputs( line, stdout );
(void) alarm( TIMEOUT );

上面出现在函数体中,我从来没见过这样的代码……

【问题讨论】:

  • 什么意思? (void) 部分?
  • 是的,什么时候有用?

标签: c coding-style


【解决方案1】:

这是一种对调试工具进行编码的形式,以牺牲人类阅读您的代码为代价,而且它被认为是有害的。特别是经典的lint 工具,如果你不使用返回值的函数的返回值,可能还有一些编译器会生成警告,而在本地抑制这种情况的唯一方法是将结果转换为void

如果你有足够的权限,要么忽略它,要么修复它(删除无用的void 演员表)。

【讨论】:

  • 我一直阅读 (void) 的意思是“我知道这会返回一个值,但我已经明确决定我不需要它”。例如alarm() 将剩余时间返回到您可能并不真正关心的任何先前设置的警报。用(void) 前缀表示我认为alarm() 返回一个值,但我不想要它。 fputs() 也类似,但 fputs() 可能会失败,所以 fputs() 你会说“我将忽略错误”,这显然很糟糕。
  • 在我的脑海中,我会说至少有一半的时间你不需要库函数的返回值,忽略它们并不意味着忽略错误。例如使用fputs,您可以更轻松地在整个写入操作结束时检查ferror,而不是不断检查fputs 的返回值,从而生成更简单的代码(因此不太可能包含错误)。我认为您没有理由明确说明您没有使用返回值这一事实。从阅读代码中可以明显看出您没有使用它的简单事实。
  • @JeremyP:R. 的意思是,通常这是为了工具的好处,而不是为了阅读代码的人。请参阅gcc.gnu.org/onlinedocs/gcc/Non_002dbugs.html 了解为什么 GCC 不会将其默认设置为在忽略返回值时发出警告的理由:“警告这种做法只会导致防御性程序员使程序混乱,其中包含数十个无效的强制转换。这样的强制转换是必需的,所以它们经常成为视觉噪音。编写这些演员表变得如此自动化,以至于它们不再传达有关程序员意图的有用信息。
  • 顺便说一句,检查stdio 中各个输出函数的错误返回通常是没有意义的,因为直到很久以后当缓冲区已满并且刷新失败时您才会遇到错误。考虑到这一点,简单地检查最后的ferror 会更有意义。
【解决方案2】:

唯一不寻常的是void 的演员表。这是一种表示您将忽略函数的返回值或表示函数不返回值的方法。一些编译器警告忽略的返回值,因此可以解决该警告。我个人认为这不是很好的风格。

【讨论】:

  • void不存在不也一样吗?
  • 是的,它只是对void 的转换,是的,没有转换的代码具有完全相同的含义。一些编译器或工具可能会在没有强制转换的情况下发出警告。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2011-01-02
    相关资源
    最近更新 更多